Spring -Aop:原理一


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就能夠利用JDKCGLIB動態代理技術採用統一方式爲目標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 接口繼承自TransactionAspectSupporttx: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  

相關文章
相關標籤/搜索