jdk或cglib的动态代理技术,请参看java基础的动态代理。
jdk动态代理技术涉及类:InvocationHandler、Proxy
cglib动态代理技术涉及类:MethodInteceptor、Enhancer
动态代理技术为目标bean织入横切逻辑,存在三个明显的需要改进的地方:
1)目标类的所有方法都添加了横切逻辑,有时我们只希望对业务类中的某些特定方法添加横切逻辑。
2)硬编码的方式指定了织入横切逻辑的织入点,即在目标类业务方法的开始和结束织入代码。
3)我们手工编写代理实例的创建过程,为不同类创建代理时,需要分别编写相应的程序,无法做到通用。
Spring AOP的主要工作就是围绕以上三点展开的:
·Pointcut(切点)指定在那些类的那些方法上织入横切逻辑。过滤条件;
·Advice(通知)用于描述横切逻辑和方法的具体织入点;
·Advisor(通知器)将Pointcut和Advice两者组装起来;
有了advisor,spring就可以利用JDK或CGLIB的动态代理技术采用统一方式为目标bean创建织入切面的代理对象。
使用XML配置的方式,大概有4种,:
1. 配置ProxyFactoryBean,显式地设置advisors, advice, target等
2. 配置AutoProxyCreator,这种方式下,还是如以前一样使用定义的bean,但是从容器中获得的其实已经是代理对象
3. 通过
4. 通过
现在以声明式事务来说明,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 接口继承自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"/>
利用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