AOP有三種植入切面的方法:其一是編譯期織入,這要求使用特殊的Java編譯器,AspectJ是其中的代表者;其二是類裝載期織入,而這要求使用特殊的類裝載器,AspectJ和AspectWerkz是其中的代表者;其三為動態(tài)代理織入,在運行期為目標類添加增強生成子類的方式,Spring AOP采用動態(tài)代理織入切面。
Spring AOP使用了兩種代理機制,一種是基于JDK的動態(tài)代理,另一種是基于CGLib的動態(tài)代理,之所以需要兩種代理機制,很大程度上是因為JDK本身只提供基于接口的代理,不支持類的代理。
什么是AOP?
面向切面編程(AOP)完善spring的依賴注入(DI),面向切面編程在spring中主要表現為兩個方面
1.面向切面編程提供聲明式事務管理
2.spring支持用戶自定義的切面
面向切面編程(aop)是對面向對象編程(oop)的補充,
面向對象編程將程序分解成各個層次的對象,面向切面編程將程序運行過程分解成各個切面。
AOP從程序運行角度考慮程序的結構,提取業(yè)務處理過程的切面,oop是靜態(tài)的抽象,aop是動態(tài)的抽象,
是對應用執(zhí)行過程中的步驟進行抽象,,從而獲得步驟之間的邏輯劃分。
aop框架具有的兩個特征:
1.各個步驟之間的良好隔離性
2.源代碼無關性
什么是DI機制?
依賴注入(Dependecy Injection)和控制反轉(Inversion of Control)是同一個概念,具體的講:當某個角色
需要另外一個角色協助的時候,在傳統的程序設計過程中,通常由調用者來創(chuàng)建被調用者的實例。但在spring中
創(chuàng)建被調用者的工作不再由調用者來完成,因此稱為控制反轉。創(chuàng)建被調用者的工作由spring來完成,然后注入調用者
因此也稱為依賴注入。
spring以動態(tài)靈活的方式來管理對象 , 注入的兩種方式,設置注入和構造注入。
設置注入的優(yōu)點:直觀,自然
構造注入的優(yōu)點:可以在構造器中決定依賴關系的順序。
spring 的優(yōu)點都有哪些?
1.降低了組件之間的耦合性 ,實現了軟件各層之間的解耦
2.可以使用容易提供的眾多服務,如事務管理,消息服務等
3.容器提供單例模式支持
4.容器提供了AOP技術,利用它很容易實現如權限攔截,運行期監(jiān)控等功能
5.容器提供了眾多的輔助類,能加快應用的開發(fā)
6.spring對于主流的應用框架提供了集成支持,如hibernate,JPA,Struts等
7.spring屬于低侵入式設計,代碼的污染極低
8.獨立于各種應用服務器
9.spring的DI機制降低了業(yè)務對象替換的復雜性
10.Spring的高度開放性,并不強制應用完全依賴于Spring,開發(fā)者可以自由選擇spring的部分或全部
一、spring工作原理:
1.spring mvc請所有的請求都提交給DispatcherServlet,它會委托應用系統的其他模塊負責負責對請求進行真正的處理工作。
2.DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller.
3.DispatcherServlet請請求提交到目標Controller
4.Controller進行業(yè)務邏輯處理后,會返回一個ModelAndView
5.Dispathcher查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象
6.視圖對象負責渲染返回給客戶端。
描述一下Spring中實現DI(Dependency Injection)的幾種方式
方式一:接口注入,在實際中得到了普遍應用,即使在IOC的概念尚未確立時,這樣的方法也已經頻繁出現在我們的代碼中。方式二:Type2 IoC: Setter injection對象創(chuàng)建之后,將被依賴對象通過set方法設置進去
方式三:Type3 IoC: Constructor injection對象創(chuàng)建時,被依賴對象以構造方法參數的方式注入
簡單描述下IOC(inversion of control)的理解
一個類需要用到某個接口的方法,我們需要將類A和接口B的實現關聯起來,最簡單的方法是類A中創(chuàng)建一個對于接口B的實現C的實例,但這種方法顯然兩者的依賴(Dependency)太大了。而IoC的方法是只在類A中定義好用于關聯接口B的實現的方法,將類A,接口B和接口B的實現C放入IoC的 容器(Container)中,通過一定的配置由容器(Container)來實現類A與接口B的實現C的關聯。
spring提供的事務管理可以分為兩類:編程式的和聲明式的。編程式的,比較靈活,但是代碼量大,存在重復的代碼比較多;聲明式的比編程式的更靈活。
編程式主要使用transactionTemplate。省略了部分的提交,回滾,一系列的事務對象定義,需注入事務管理對象.
void add()
{
transactionTemplate.execute( new TransactionCallback(){
pulic Object doInTransaction(TransactionStatus ts)
{ //do sth}
}
}
聲明式:
使用TransactionProxyFactoryBean:
PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED,readOnly
圍繞Poxy的動態(tài)代理 能夠自動的提交和回滾事務
org.springframework.transaction.interceptor.TransactionProxyFactoryBean
PROPAGATION_REQUIRED–支持當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。
PROPAGATION_SUPPORTS–支持當前事務,如果當前沒有事務,就以非事務方式執(zhí)行。
PROPAGATION_MANDATORY–支持當前事務,如果當前沒有事務,就拋出異常。
PROPAGATION_REQUIRES_NEW–新建事務,如果當前存在事務,把當前事務掛起。
PROPAGATION_NOT_SUPPORTED–以非事務方式執(zhí)行操作,如果當前存在事務,就把當前事務掛起。
PROPAGATION_NEVER–以非事務方式執(zhí)行,如果當前存在事務,則拋出異常。
PROPAGATION_NESTED–如果當前存在事務,則在嵌套事務內執(zhí)行。如果當前沒有事務,則進行與PROPAGATION_REQUIRED類似的操作。
spring中的核心類有那些,各有什么作用?
BeanFactory:產生一個新的實例,可以實現單例模式
BeanWrapper:提供統一的get及set方法
ApplicationContext:提供框架的實現,包括BeanFactory的所有功能
spring的ioc及di代表什么意思?
控制權由代碼轉向容器,通過容器動態(tài)將某些對象加入。
如何在spring中實現國際化?
在applicationContext.xml加載一個bean
message.properties是一個鍵名加鍵值的文件,