jdk或cglib的动态代理技术,请参看java基础的动态代理。

    jdk动态代理技术涉及类:InvocationHandler、Proxy

    cglib动态代理技术涉及类:MethodInteceptor、Enhancer


    动态代理技术为目标bean织入横切逻辑,存在三个明显的需要改进的地方:

1)目标类的所有方法都添加了横切逻辑,有时我们只希望对业务类中的某些特定方法添加横切逻辑。

2)硬编码的方式指定了织入横切逻辑的织入点,即在目标类业务方法的开始和结束织入代码。

3)我们手工编写代理实例的创建过程,为不同类创建代理时,需要分别编写相应的程序,无法做到通用




Spring AOP的主要工作就是围绕以上三点展开的:

·Pointcut(切点)指定在那些类的那些方法上织入横切逻辑。过滤条件;

·Advice(通知)用于描述横切逻辑和方法的具体织入点;

·Advisor(通知器)将Pointcut和Advice两者组装起来;

    有了advisor,spring就可以利用JDKCGLIB动态代理技术采用统一方式为目标bean创建织入切面的代理对象


使用XML配置的方式,大概有4种,:

1. 配置ProxyFactoryBean,显式地设置advisors, advice, target等

2. 配置AutoProxyCreator,这种方式下,还是如以前一样使用定义的bean,但是从容器中获得的其实已经是代理对象

3. 通过来配置

4. 通过来配置,使用AspectJ的注解来标识通知及切入点


现在以声明式事务来说明,spring ioc、aop、事务管理的原理。


   

    <tx:advice id="txAdvice" transaction-manager="transactionManager">

       <tx:attributes>

             <tx:method name="get*" propagation="SUPPORTS" read-only="true"/>

          

       

    


    利用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"/>


   利用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