3、AOP
(1)Aspect-oriented Programming
l 補充OOP
l 分解問題的各個方面(或關係)
l 模塊化關係
l 用法:
? 持久化
? 事務管理
? 安全
? 日誌管理
? 調試
(2)AOP概念
l Aspect:模塊化關係(concern)
l Joinpoint:程序執行時的一個點
l Advice:在具體joinpoint做的動作
l Pointcut:一個Advice應該激活的指定joinpoint集合
l Introduction:添加方法或域到Advice類中
(3)Pointcut
l 一個Advice應該激活的指定joinpoint集合
限制pointcut爲一組target類;靜態pointcuts不需要使用帶參數的方法
(4)Pointcut實現
l 正則表達式
方法名全路經匹配Perl5正則表達式
(5)Advice
l 在具體joinpoint做的動作
Spring使用包圍joinpoint的攔截器(Interceptor)鏈來實現Advice
l 例子:
(6)Advice類型
l Around Advice(如前面的例子)
l Before Advice
l Throws Advice
l After returning Advice
l Introduction Advice
(7)Spring Advisors
l PointcutAdvisor = Pointcut + Advice
l 每個內建的Advice都有一個Advisor
l 例子:
(8)ProxyFactory
l 使用ProxyFactory獲得Advised對象
? 定義應用的pointcuts和advices
? 以代理對象返回interceptor
? 使用Java動態代理或CGLIB2(可以代理接口和類)
l 編程方式創建AOP代理
(9)ProxyFactoryBean
l 用來獲得Bean的代理
l 要代理的Bean:
PersonImpl實現Person接口
l Interceptors和Advisors:
l 代理:
l 使用Bean:
? 客戶程序應該獲得person Bean,而不是personTarget
? 可以通過應用程序context或編程方式來訪問
l 如果是代理類而不是接口
? 將proxyTargetClass設置爲true,來替代proxyInterfaces
? 代理要擴展target類(由CGLIB來構造)
(10)AutoProxy
l 自動代理的創建:
? 只要定義targets
? 選擇的Bean會被自動代理
l 不需要爲每個target Bean使用ProxyFactoryBean
(11)BeanNameAutoProxyCreator
l 使用Bean名選擇targets
(12)AdvisorAutoProxyCreator
l 自動應用Advisors到context中的Bean
? 每個Advisor對應一個pointcut和advice
? 如果pointcut應用到Bean,就會被advice攔截
l 有助於保持同一個advice應用到多個事務對象的一致性
l 不可能獲得沒有advised的對象
l 例子:
這個Advisor應用debugInterceptor到任何類的所有get方法
(13)AOP高級特性
l 元數據驅動的自動代理
l 目標源(TargetSources)
? 熱交換目標源:當允許調用者保持他的引用時,允許切換代理的Bean
? 目標源池:維護相同實例的池,在方法激活時釋放對象到池中