1、談談你對Spring的理解酥宴?
spring 是一個開源的輕量級 JavaBean 容器框架啦吧。使用 JavaBean 代替 EJB ,并提供了豐富的企業(yè)應用功能拙寡,降低應用開發(fā)的復雜性授滓。
1)輕量:非入侵性的、所依賴的東西少肆糕、資源占用少般堆、部署簡單,不同功能選擇不同的 jar 組合诚啃;
2)容器:工廠模式實現對 JavaBean 進行管理淮摔,通過控制反轉(IOC)將應用程序的配置和依賴性與應用代碼分開;
3)低耦合:通過 xml 配置或注解即可完成 bean 的依賴注入始赎;
4)AOP:通過 xml 配置 或注解即可加入面向切面編程的能力和橙,完成切面功能仔燕,如:日志,事務等的統一處理魔招;
5)方便集成:通過配置和簡單的對象注入即可集成其他框架晰搀,如 Mybatis、Hibernate办斑、Shiro等厕隧;
6)豐富的功能:JDBC 層抽象、事務管理俄周、MVC吁讨、Java Mail、任務調度峦朗、JMX建丧、JMS、JNDI波势、EJB翎朱、動態(tài)語言、遠程訪問尺铣、Web Service等拴曲。
2、使用Spring框架的好處是什么凛忿?
輕量:Spring 是輕量的澈灼,基本的版本大約2MB。
控制反轉:Spring通過控制反轉實現了松散耦合店溢,對象們給出它們的依賴叁熔,而不是創(chuàng)建或查找依賴的對象們。
面向切面的編程(AOP):Spring支持面向切面的編程床牧,并且把應用業(yè)務邏輯和系統服務分開荣回。 容器:Spring 包含并管理應用中對象的生命周期和配置。
MVC框架:Spring的WEB框架是個精心設計的框架戈咳,是Web框架的一個很好的替代品心软。
事務管理:Spring 提供一個持續(xù)的事務管理接口,可以擴展到上至本地事務下至全局事務(JTA)著蛙。
異常處理:Spring 提供方便的API把具體技術相關的異常(比如由JDBC删铃,Hibernate or JDO拋出的)轉化為一致的unchecked 異常。
3册踩、什么是Ioc?
IoC (Inversion of Control) 控制反轉泳姐。是一種設計思想,在Java開發(fā)中暂吉,將你設計好的對象交給容器控制胖秒,而不是顯式地用代碼進行對象的創(chuàng)建缎患。 把創(chuàng)建和查找依賴對象的控制權交給 IoC 容器,由 IoC 容器進行注入阎肝、組合對象挤渔。這樣對象與對象之間是松耦合、便于測試风题、功能可復用的(減少對象的創(chuàng)建和內存消耗)判导,使得程序的整個體系結構可維護性、靈活性沛硅、擴展性變高眼刃。然后它底層原理的話是用到了Java的反射機制,之前我有在猜測它是不是用運行時類也就是Class.forname();的方法摇肌,因為我們使用Spring的時候是需要在xml文件或者通過注解的方式配置bean的擂红,我們提供了類的全類名,然后IoC容器通過Class.forName()方法围小,去幫我們創(chuàng)建對象昵骤,結果我發(fā)現不是,它是使用 ClassLoader來加載類肯适,有興趣的小伙伴請自行去了解為什么(因為我也不懂)变秦。
使用 IoC 的好處:
1)資源集中管理,實現資源的可配置和易管理框舔;
2)降低了資源的依賴程度蹦玫,即松耦合;
3)便于測試雨饺;
4)功能可復用(減少對象的創(chuàng)建和內存消耗)钳垮;
5)使得程序的整個體系結構可維護性、靈活性额港、擴展性變高。
4歧焦、什么是AOP?
AOP: Aspect Oriented Programming移斩,面向切面編程。在面向對象編程(OOP)思想中绢馍,我們將事物縱向抽象成一個個的對象向瓷。而在面向切面編程中,我們將一個個對象某些類似的方面橫向抽象成一個切面舰涌,對這個切面進行一些如權限驗證猖任,事物管理,記錄日志等公用操作處理的過程就是面向切面編程的思想瓷耙。通過預編譯和運行期動態(tài)代理實現程序功能的統一維護朱躺。在Spring框架中刁赖,AOP就是一個很重要的功能。
實現 AOP 的方式
1)創(chuàng)建容器對象的時候长搀,根據切入點表達式攔截的類宇弛,生成代理對象。
2)如果目標對象有實現接口源请,使用JDK動態(tài)代理的方式枪芒。如果目標對象沒有實現接口,則使用CGLib代理谁尸。然后從容器獲取代理后的對象舅踪,在運行期植入"切面"類的方法。
Spring中AOP實現的兩種方式都是基于動態(tài)代理的方式下良蛮,有想法的小伙伴可以自行思考為什么AOP實現要用動態(tài)代理抽碌,用靜態(tài)代理不可以嗎?
大體功能
1)Spring聲明式事務管理配置背镇;
2) Controller層的參數校驗咬展;
3) 使用Spring AOP實現MySQL數據庫讀寫分離案例分析;
4.) 在執(zhí)行方法前,判斷是否具有權限瞒斩;
5)對部分函數的調用進行日志記錄破婆。監(jiān)控部分重要函數,若拋出指定的異常胸囱,可以以短信或郵件方式通知相關人員祷舀;
6) 信息過濾,頁面轉發(fā)等等功能烹笔。
5裳扯、Spring常見注解?
注解名稱 | 作用 |
---|---|
@Controller | 組合注解(組合了@Component注解)谤职,應用在MVC層(控制層),DispatcherServlet會自動掃描注解了此注解的類饰豺,然后將web請求映射到注解了@RequestMapping的方法上。 |
@Service | 組合注解(組合了@Component注解)允蜈,應用在service層(業(yè)務邏輯層) |
@Reponsitory | 組合注解(組合了@Component注解)冤吨,應用在dao層(數據訪問層) |
@Component | 表示一個帶注釋的類是一個“組件”殃姓,成為Spring管理的Bean鳞陨。當使用基于注解的配置和類路徑掃描時柜去,這些類被視為自動檢測的候選對象纳猪。同時@Component還是一個元注解夭苗。 |
@Autowired | Spring提供的工具(由Spring的依賴注入工具(BeanPostProcessor宅楞、BeanFactoryPostProcessor)自動注入落塑。) |
@Resource | JSR-250提供的注解 |
@Inject | JSR-330提供的注解 |
@Configuration | 聲明當前類是一個配置類 |
@ComponentScan | 自動掃描指定包下所有使用@Service,@Component,@Controller,@Repository的類并注冊 |
@Bean | 注解在方法上朱庆,聲明當前方法的返回值為一個Bean。返回的Bean對應的類中可以定義init()方法和destroy()方法捺癞,然后在@Bean(initMethod=”init”,destroyMethod=”destroy”)定義夷蚊,在構造之后執(zhí)行init,在銷毀之前執(zhí)行destroy翘簇。 |
@Aspect | 聲明一個切面(就是說這是一個額外功能) |
@After | 后置建言(advice)撬码,在原方法前執(zhí)行。 |
@Before | 前置建言(advice)版保,在原方法后執(zhí)行呜笑。 |
@Around | 環(huán)繞建言(advice),在原方法執(zhí)行前執(zhí)行彻犁,在原方法執(zhí)行后再執(zhí)行(@Around可以實現其他兩種advice) |
@PointCut | 聲明切點叫胁,即定義攔截規(guī)則,確定有哪些方法會被切入 |
@Transactional | 聲明事務(一般默認配置即可滿足要求汞幢,當然也可以自定義) |
@Cacheable | 聲明數據緩存 |
@EnableAspectJAutoProxy | 開啟Spring對AspectJ的支持 |
@Value | 值得注入驼鹅。經常與Sping EL表達式語言一起使用,注入普通字符森篷,系統屬性输钩,表達式運算結果,其他Bean的屬性仲智,文件內容买乃,網址請求內容,配置文件屬性值等等 |
@PropertySource | 指定文件地址钓辆。提供了一種方便的剪验、聲明性的機制,用于向Spring的環(huán)境添加PropertySource前联。與@configuration類一起使用功戚。 |
@PostConstruct | 標注在方法上,該方法在構造函數執(zhí)行完成之后執(zhí)行似嗤。 |
@PreDestroy | 標注在方法上啸臀,該方法在對象銷毀之前執(zhí)行。 |
@Profile | 表示當一個或多個指定的文件是活動的時烁落,一個組件是有資格注冊的壳咕。使用@Profile注解類或者方法,達到在不同情況下選擇實例化不同的Bean顽馋。@Profile(“dev”)表示為dev時實例化。 |
@EnableAsync | 開啟異步任務支持幌羞。注解在配置類上寸谜。 |
@Async | 注解在方法上標示這是一個異步方法,在類上標示這個類所有的方法都是異步方法属桦。 |
@EnableScheduling | 注解在配置類上熊痴,開啟對計劃任務的支持他爸。 |
@Scheduled | 注解在方法上,聲明該方法是計劃任務果善。支持多種類型的計劃任務:cron,fixDelay,fixRate |
@Conditional | 根據滿足某一特定條件創(chuàng)建特定的Bean |
@Enable* | 通過簡單的@Enable來開啟一項功能的支持诊笤。所有@Enable注解都有一個@Import注解,@Import是用來導入配置類的巾陕,這也就意味著這些自動開啟的實現其實是導入了一些自動配置的Bean(1.直接導入配置類2.依據條件選擇配置類3.動態(tài)注冊配置類) |
@RunWith | 這個是Junit的注解讨跟,springboot集成了junit。一般在測試類里使用:@RunWith(SpringJUnit4ClassRunner.class) — SpringJUnit4ClassRunner在JUnit環(huán)境下提供Sprng TestContext Framework的功能 |
@ContextConfiguration | 用來加載配置ApplicationContext鄙煤,其中classes屬性用來加載配置類:@ContextConfiguration(classes = {TestConfig.class(自定義的一個配置類)}) |
@ActiveProfiles | 用來聲明活動的profile–@ActiveProfiles(“prod”(這個prod定義在配置類中)) |
6晾匠、Spring有哪些主要模塊?
1)Spring Core:框架的最基礎部分梯刚,提供 IoC 容器凉馆,對 bean 進行管理。
2)Spring Context: 基于 bean亡资,提供上下文信息澜共,擴展出JNDI、EJB锥腻、電子郵件嗦董、國際化、校驗和調度等功能旷太。
3)Spring DAO: 提供了JDBC的抽象層展懈,它可消除冗長的JDBC編碼和解析數據庫廠商特有的錯誤代碼,還提供了聲明性事務管理方法供璧。
4)Spring ORM: 提供了常用的“對象/關系”映射APIs的集成層存崖。 其中包括JPA、Hibernate睡毒、MyBatis 等来惧。
5)Spring AOP: 提供了符合AOP Alliance規(guī)范的面向方面的編程實現。
6)Spring Web: 提供了基礎的 Web 開發(fā)的上下文信息演顾,可與其他 web 進行集成供搀。
7)Spring Web MVC: 提供了 Web 應用的 Model-View-Controller 全功能實現。
7钠至、Spring支持幾種bean的作用域葛虐?
Spring框架支持以下五種bean的作用域:
singleton : bean在每個Spring ioc 容器中只有一個實例。
prototype:一個bean的定義可以有多個實例棉钧。
request:每次http請求都會創(chuàng)建一個bean屿脐,該作用域僅在基于web的Spring ApplicationContext情形下有效。
session:在一個HTTP Session中,一個bean定義對應一個實例的诵。該作用域僅在基于web的Spring ApplicationContext情形下有效万栅。
global-session:在一個全局的HTTP Session中,一個bean定義對應一個實例西疤。該作用域僅在基于web的Spring ApplicationContext情形下有效烦粒。
8、spring配置bean實例化有哪些方式代赁。
1)使用類構造器實例化(默認無參數)
<bean id="bean1" class="cn.itcast.spring.b_instance.Bean1"></bean>
2)使用靜態(tài)工廠方法實例化(簡單工廠模式)
調用Bean2Factory的getBean2方法得到bean2
<bean id="bean2" class="cn.itcast.spring.b_instance.Bean2Factory" factory-method="getBean2"></bean>
3)使用實例工廠方法實例化(工廠方法模式)
先創(chuàng)建工廠實例bean3Facory扰她,再通過工廠實例創(chuàng)建目標bean實例
<bean id="bean3Factory" class="cn.itcast.spring.b_instance.Bean3Factory"></bean>
<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean>
9、Spring中的單例Beans是線程安全的嗎管跺?
Spring 并沒有對單例bean進行任何多線程的封裝處理义黎。關于單例bean的線程安全和并發(fā)問題需要開發(fā)者自行去搞定。但實際上豁跑,大部分的Spring bean (比如Service類和DAO類)并沒有可變的狀態(tài)廉涕,所以在某種程度上說Spring的單例bean是線程安全的。如果你的bean有多種狀態(tài)的話(比如View Model對象)艇拍,就需要自行保證線程安全狐蜕,最淺顯的解決辦法就是多態(tài)bean的作用域由“singleton”改為“prototype”。
10卸夕、Spring事務的五種隔離級別
DEFAULT(默認):默認的隔離級別层释,使用數據庫默認的事務隔離級別;
READ_UNCOMMITTED(讀未提交):這是事務最低的隔離級別快集,它允許另外一個事務可以看到這個事務未提交的數據贡羔。這種隔離級別會產生臟讀,不可重復讀和幻讀个初;
READ_COMMITTED(讀已提交):保證一個事務修改的數據提交后才能被另外一個事務讀取乖寒。另外一個事務不能讀取該事務未提交的數據。這種事務隔離級別可以避免臟讀出現院溺,但是可能會出現不可重復讀和幻讀楣嘁;
REPEATABLE_READ(可重復讀):這種事務隔離級別可以防止臟讀,不可重復讀珍逸。但是可能出現幻讀逐虚。它除了保證一個事務不能讀取另一個事務未提交的數據外,還保證了避免不可重復讀谆膳。(mysql默認的事務隔離級別)叭爱;
SERIALIZABLE(串行化):這是花費最高代價但是最可靠的事務隔離級別。事務被處理為順序執(zhí)行漱病。除了防止臟讀涤伐,不可重復讀外馒胆,還避免了幻讀。
11凝果、Spring事務的七種傳播特性
1、PROPAGATION_REQUIRED:如果當前存在事務睦尽,方法將加入到這個事務器净,不存在,就新建一個事務当凡。
2山害、PROPAGATION_REQUIRED_NEW:當前存在事務,掛起當前事務沿量,新建一個新的事務浪慌。
3、PROPAGATION_MANDATORY:當前方法必須運行在事務中朴则,如果不存在事務权纤,就拋出異常。
4乌妒、PROPAGATION_NEVER:當前方法不需要運行在事務汹想,如果是事務調用,就拋出異常撤蚊。
5古掏、PROPAGATION_SUPPORTS:當前存在事務就在事務中運行,不存在就正常執(zhí)行侦啸。
6槽唾、PROPAGATION_NOT_SUPPORTED:當前方法不支持事務執(zhí)行, 如果存在事務光涂,掛起事務庞萍,執(zhí)行完后在繼續(xù)執(zhí)行事務。
7顶捷、PROPAGATION_NESTED:當父事務調用到這個方法挂绰,此時會創(chuàng)建一個savepoint,啟動一個嵌套事務執(zhí)行該方法服赎。如果方法失敗葵蒂,回滾到savepoint點。嵌套事務是外部事務的一部分重虑,如果外部事務失敗了践付,會全部回滾。
12缺厉、Spring框架中都用到了那些設計模式永高?
Spring框架中使用了大量的設計模式隧土,下面列舉比較有代表性的:
1)代理模式 -- AOP;
2)單例模式 -- 在Spring配置文件中定義的bean默認為單例模式命爬;
3)模板方法 -- 用來解決代碼重復的問題曹傀,比如RestTemplate,JpaTemplate;
4)工廠模式 -- BeanFactory用來創(chuàng)建對象的實例饲宛;
5)前端控制器 -- Spring提供了DispatcherServlet來對請求進行分發(fā)皆愉;
6)依賴注入 -- 貫穿BeanFactory/ApplicationContext接口的核心理念。
未完待續(xù)