BeanFactory和ApplicationContext有什么區(qū)別
1、BeanFactory可以理解為含有bean集合的工廠類仆百。BeanFactory包含了bean的定義染坯,以便在接收到客戶端請求時將對應的bean實例化。
2、BeanFactory還能咋子實例化對象時生成協(xié)作類之間的關系伦吠。
此舉將bean自身和bean客戶端的配置中解放出來根暑。BeanFactory還包含了bean生命周期的控制,調(diào)用客戶端的初始化方法和銷毀方法贮预。
從表面上看贝室,applicationContext和BeanFactory一樣具有bean的定義、bean關聯(lián)關系設置仿吞,根據(jù)請求分發(fā)bean的功能滑频。
但applicationContext在此基礎上還提供了其他功能
1)提供了支持國際化的文本消息
2)統(tǒng)一的資源文件讀取方式
3)已在監(jiān)聽中注冊的bean的事件
Spring Bean的生命周期
SpringBean的生命周期簡單易懂。當一個bean實例被初始化時唤冈,需要執(zhí)行一系列的初始化操作以達到可以用狀態(tài)峡迷。
同樣的,當一個bean不再被調(diào)用時需要進行相關的析構操作你虹,并從bean容器中移除绘搞。
SpringBeanFactory負責管理在spring容器中被創(chuàng)建的bean的生命周期。Bean的生命周期由兩組回調(diào)方法組成傅物。
1)初始化之后調(diào)用的回調(diào)方法
2)銷毀之前調(diào)用的回調(diào)方法
Spring框架提供了一下四種方式來管理bean的生命周期事件:
1)InitializingBean和DisposableBean回調(diào)接口
2)針對特殊行為的其他Aware接口
3)Bean配置文件中的Custom init()方法和destroy()方法
4)@PostConstruct和@PreDestory注解方式
SpringIOC如何實現(xiàn)
Spring中的org.springframework.beans包和org.springframework.context包構成了Spring框架IoC容器的基礎夯辖。
BeanFactory接口提供了一個先進的配置機制,使得任何類型的對象的配置成為可能董饰。
ApplicationContext接口對BeanFactory進行了擴展蒿褂,在BeanFactory的基礎上添加了其他功能
比如Spring與AOP更容易繼承圆米,也提供了處理國際化的的message resource的機制、事務傳播以及應用層的特別配置啄栓,比如針對Web應用的WebApplicationContext娄帖。
org.springframework.beans.factory.BeanFactory是SpringIoC容器的具體實現(xiàn),用來包裝和管理前面提到的各種bean昙楚。BeanFactory接口是SpringIoC容器的核心接口近速。
說說SpringAOP
面向切面編程,在我們的應用中桂肌,經(jīng)常需要做一些事情数焊,但是這些事情與核心業(yè)務無關,比如用日志記錄所有update方法的執(zhí)行時間崎场、操作人等信息佩耳。
通過SpringAOP技術,就是可以在不該核心業(yè)務代碼的情況下完成該需求谭跨。
SpringAOP的實現(xiàn)原理
SpringAOP的動態(tài)代理主要有兩種方式干厚,JDK動態(tài)代理和CGLIB動態(tài)代理。JDK動態(tài)代理通過反射來接收被代理的類螃宙,并且要求被代理的類必須實現(xiàn)一個接口
JDK動態(tài)代理的核心是InvocationHandler接口和Proxy類蛮瞄。
如果目標類沒有實現(xiàn)接口,那么SpringAOP會選擇使用CGLIB來動態(tài)代理目標類谆扎。CGLIB是一個代碼生成累哭挂捅,可以在運行時動態(tài)生成某個類的子類
注意,CGLIB是通過繼承的方式做的動態(tài)代理堂湖,因此如果某個類被標記為final闲先,則無法使用CGLIB做動態(tài)代理。
動態(tài)代理
JDK動態(tài)代理和委托類都要實現(xiàn)同一個接口无蜂。也就是說只有實現(xiàn)了某個接口的類可以使用Java的動態(tài)代理機制伺糠。
但是實際使用中并不是遇到的所有類都會實現(xiàn)一個接口。因此對于沒有實現(xiàn)接口的類斥季,就不能使用該機制
而CGLIB可實現(xiàn)對類的動態(tài)代理训桶。
Spring事務實現(xiàn)方式
1、編碼方式
通過編碼方式實現(xiàn)事務酣倾,即類似于JDBC編程實現(xiàn)事務管理
2舵揭、聲明式事務管理,通過xm或注解方式躁锡,將事務規(guī)則應用到業(yè)務邏輯中
1)基于xml配置文件方式
2)在業(yè)務方法上進行@Transaction注解
Spring事務底層原理
1午绳、劃分處理單元——IOC
由于Spring解決的問題是對單個數(shù)據(jù)庫進行局部事務處理的,具體的實現(xiàn):
首先用spring中的IOC劃分了事務處理單元稚铣,并且將對事務的各種配置放到了IOC容器中(設置事務管理器箱叁,設置事務的傳播特性及隔離級別)
2、AOP攔截需要進行事務出來的類
Spring事務處理模塊是通過AOP功能來實現(xiàn)聲明式事務處理惕医,
具體操作(比如事務實行的配置和讀取,事務對象的抽象),用TransactionProxyFactoryBean接口來使用AOP功能浇借,生成proxy代理對象
通過TransactionInterceptor完成對代理方法的攔截读慎,將事務處理的功能編織到攔截方法中。
讀取ioc容器中事務配置屬性峡钓,轉化為spring事務處理需要的內(nèi)部數(shù)據(jù)結構妓笙,轉化為TransactionAttribute的數(shù)據(jù)對象
3、對事務處理實現(xiàn)(事務的生存能岩、提交寞宫、回滾、掛起)
spring委托給具體的事務處理器實現(xiàn)拉鹃,實現(xiàn)了一個抽象和適配辈赋。
適配的具體事務處理器:DataSource數(shù)據(jù)源支持、Hibernate數(shù)據(jù)源事務處理支持膏燕、JDO數(shù)據(jù)源事務處理支持钥屈,JPA、JTA數(shù)據(jù)源事務處理支持坝辫。
這些支持都是通過設計PlateformTransactionManager篷就、AbstractPlateformTransaction一系列事務處理的支持。
為了常用數(shù)據(jù)源支持提供了一系列的TransactionManager近忙。
4竭业、結合
TransactionPlateManager實現(xiàn)了TransactionInterception接口,讓其與TransactionProxyFactoryBean結合起來银锻,形成Spring聲明式事務處理的設計體系永品。
如果自定義注解實現(xiàn)功能
創(chuàng)建自定義注解和創(chuàng)建一個接口相似,但是注解的 interface 關鍵字需要以@符號開頭击纬。
注解方法不能帶有參數(shù)鼎姐;
注解方法返回值類型限定為:基本類型、String更振、Enums炕桨、Annotation 或者是這些類型的
數(shù)組;
注解方法可以有默認值肯腕;
注解本身能夠包含元注解献宫,元注解被用來注解其它注解。
SpringMVC運行流程
1实撒、springmvc將所有請求都提交給DispatcherServlet姊途,它會委托應用系統(tǒng)的其他模塊負責對請求進行真正的處理工作涉瘾。
2、DispatherServlet查詢一個或多個handlerMapping捷兰,找到處理請求的Controller
3立叛、DispatherServlet將請求提交到目標Controller
4、Controller進行業(yè)務邏輯處理后贡茅,會返回一個ModelAndView
5秘蛇、DispatherServlet查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象
6顶考、視圖對象負責渲染返回給客戶端
SpringMVC啟動流程
1赁还、在web.xml文件中給SpringMVC的Servlet配置了load-on-startup,所以程序啟動的時候會初始化SpringmVC
2驹沿、在httpServletBean中將配置的contextConifgLocation屬性設置到servlet中
3艘策、然后在Frameworkservlet中創(chuàng)建了WebApplicationContext
4、DispatherServlet根據(jù)ContextConfigLocation配置classPath下的xml文件初始化進行SpringMVC總的組件渊季。
Spring的單例實現(xiàn)原理
Spring對Bean實例的創(chuàng)建是采用單例注冊表的方式進行實現(xiàn)的柬焕,而這個注冊表的緩存是ConcurrentHashMap對象
Spring框架中用到了哪些設計模式
1、代理模式:在AOP和remoting中被用的比較多
2梭域、單例模式:在spring配置文件中定義的bena默認為單例模式
3斑举、模版方法:用來解決代碼重復的問題。比如RestTemplate病涨、JmsTemplate富玷、JpaTemlate
4、前端控制器:Spring提供了DispatherServlet來對請求進行分發(fā)
5既穆、視圖幫助(ViewHelper):Spring提供了一系列的JSP標簽赎懦,高效宏來輔助將分散的代碼整合在視圖里。
6幻工、依賴注入:貫穿BeanFactory/ApplcationContext接口的核心理念
7励两、工廠模式:BeanFactory用來創(chuàng)建對象的實例