在第一篇中,我们用配置代理工厂的方式实现了面向切面记日志的功能。非常便捷的实现了AOP,但当我们需要对多个切入点配置通知的时候就需要声明多个代理工厂,这样导致配置文件内容过多,配置过程也很繁琐。spring.net提供了很多便捷的方式来改善配置的过程,我们往下看,
配置实现AOP需要三个步骤,
1、申明对象
2、申明通知
3、申明切入点
申明对象很简单,一个object,设置id和type即可。
申明通知有很多方法,先来看看几种自动代理的方式,
1、ObjectNameAutoProxyCreator
<object id="DataService" type="AOPDmo.DataService, AOPDmo"/>
<object id="LogAdvice" type="AOPDmo.LogAdvice, AOPDmo"/>
<object id="advisor" type="Spring.Aop.Framework.AutoProxy.ObjectNameAutoProxyCreator, Spring.Aop"> <property name="ObjectNames"> <list> <value>*Service</value> </list> </property> <property name="InterceptorNames"> <list> <value>LogAdvice</value> </list> </property> </object>
自动代理包括了通知和切入点的设置,和ProxyFactoryObject一样,ObjectNameAutoProxyCreator有一个InterceptorNames属性用来告诉代理工厂需要的通知。
不一样的是,ObjectNameAutoProxyCreator用ObjectNames属性来告诉代理工厂切入点是一个正则表达式,这里匹配的是所有以Service结尾的object对象。
2、DefaultAdvisorAutoProxyCreator
<object id="ProxyCreator" type="Spring.Aop.Framework.AutoProxy.DefaultAdvisorAutoProxyCreator, Spring.Aop"/>
该类会在当前容器中自动应用满足条件的Advisor,而不用在自动代理Advisor的对象定义中包含特定的对象名。他和RegularExpressionMethodPointcutAdvisor配合实现AOP,后面会重新提到
3、AbstractAdvisorAutoProxyCreator
这是DefaultAdvisorAutoProxyCreator的父类。如果在某些情况下框架提供的DefaultAdvisorAutoProxyCreator
不能满足你的需要,你可以通过继承这个类来创建你自己的自动代理创建器。
1、正则表达式切入点
a.SdkRegularExpressionMethodPointcut
<object id="advisor" type="Spring.Aop.Support.SdkRegularExpressionMethodPointcut, Spring.Aop"> <property name="pattern" value="AOPDmo.*.*"/> </object> <aop:config> <aop:advisor pointcut-ref="advisor" advice-ref="LogAdvice"></aop:advisor> </aop:config>
SdkRegularExpressionMethodPointcut利用正则表达式将所有和property匹配的对象都作为切入点,解释下这里的正则(命名空间).(类).(方法),例子的意思是AOPDmo命名空间下任何类的任何方法都作为切入点。这里的*号经本人测试AOPDmo*.是无效的,只要以*号结尾那么就是"所有",并不是以AOPDmo开头的意思。而*AOPDmo则是以AOPDmo结尾的意思。
b.RegularExpressionMethodPointcutAdvisor
<object id="ProxyCreator" type="Spring.Aop.Framework.AutoProxy.DefaultAdvisorAutoProxyCreator, Spring.Aop"/> <object id="advisor" type="Spring.Aop.Support.RegularExpressionMethodPointcutAdvisor, Spring.Aop"> <property name="advice"> <ref local="LogAdvice"/> </property> <property name="patterns"> <list> <value>.*.SaveData</value> </list> </property> </object>
如果只需要定义一个模式字符串,可以使用Pattern属性,不必用Patterns属性定义模式列表。RegularExpressionMethodPointcutAdvisor来申明切入点和通知,由DefaultAdvisorAutoProxyCreator来创建。
这里列举了简单常用的配置方法,还有很多更复杂,但是更灵活的东西需要去了解,学习。