jdk或cglib的動態代理技術,請參看java基礎的動態代理。java
jdk動態代理技術涉及類:InvocationHandler、Proxyspring
cglib動態代理技術涉及類:MethodInteceptor、Enhancerexpress
動態代理技術爲目標bean織入橫切邏輯,存在三個明顯的須要改進的地方:ide
1)目標類的全部方法都添加了橫切邏輯,有時咱們只但願對業務類中的某些特定方法添加橫切邏輯。編碼
2)硬編碼的方式指定了織入橫切邏輯的織入點,即在目標類業務方法的開始和結束織入代碼。spa
3)咱們手工編寫代理實例的建立過程,爲不一樣類建立代理時,須要分別編寫相應的程序,沒法作到通用。代理
Spring AOP的主要工做就是圍繞以上三點展開的:orm
·Pointcut(切點)指定在那些類的那些方法上織入橫切邏輯。過濾條件;對象
·Advice(通知)用於描述橫切邏輯和方法的具體織入點;繼承
·Advisor(通知器)將Pointcut和Advice二者組裝起來;
有了advisor,spring就能夠利用JDK或CGLIB的動態代理技術採用統一方式爲目標bean建立織入切面的代理對象。
使用XML配置的方式,大概有4種,:
1. 配置ProxyFactoryBean,顯式地設置advisors, advice, target等
2. 配置AutoProxyCreator,這種方式下,仍是如之前同樣使用定義的bean,可是從容器中得到的其實已是代理對象
3. 經過<aop:config>來配置
4. 經過<aop:aspectj-autoproxy>來配置,使用AspectJ的註解來標識通知及切入點
如今以聲明式事務來講明,spring ioc、aop、事務管理的原理。
<!-- 事務攔截器 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="*" propagation="REQUIRED" read-only="false"/>
</tx:attributes>
</tx:advice>
利用springIOC,解析標籤建立對象。tx:advice對應TransactionInterceptor,它實現了MethodInterceptor 接口繼承自TransactionAspectSupport;tx:attributes對應NameMatchTransactionAttributeSource,它的成員屬性nameMap保存方法名稱和事務屬性對象RuleBasedTransactionAttribute 的對應關係;tx:method對應RuleBasedTransactionAttribute;
解析涉及類:
//模板模式
NamespaceHandler
NamespaceHandlerSupport
TxNamespaceHandler
//接口:
BeanDefinitionParser
AbstractBeanDefinitionParser
AbstractSingleBeanDefinitionParser
TxAdviceBeanDefinitionParser
//屬性:transactionAttributeSource
TransactionAspectSupport
//接口:
MethodInterceptor
TransactionInterceptor
//屬性:nameMap
NameMatchTransactionAttributeSource
RuleBasedTransactionAttribute
<!--自動建立器 -->
<aop:config>
<aop:pointcut expression="execution(* com.afocus.core.service..*.*(..))" id="txPointcut"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>
利用springIOC,解析標籤建立對象。aop:config對應AspectJAwareAdvisorAutoProxyCreator;aop:pointcut對應AspectJExpressionPointcut ;aop:advisor對應DefaultBeanFactoryPointcutAdvisor
解析涉及類:
//aop:config解析
AopNamespaceHandler
ConfigBeanDefinitionParser
//自動建立代理
ProxyConfig
ProxyProcessorSupport
AbstractAutoProxyCreator
AbstractAdvisorAutoProxyCreator
AspectJAwareAdvisorAutoProxyCreator
//通知
//接口
Pointcut
ExpressionPointcut
AbstractExpressionPointcut
AspectJExpressionPointcut
//通知器 屬性:adviceBeanName pointcut
DefaultBeanFactoryPointcutAdvisor