Spring的Advisor是Pointcut和Advice的配置器,它是将Advice注入程序中Pointcut位置的代码。org.springframework.aop.support.DefaultPointcutAdvisor是最通用的Advisor类。在Spring中,主要通过XML的方式来配置Pointcut和Advice。
使用Spring提供的类org.springframework.aop.framework.ProxyFactoryBean是创建AOP的最基本的方式。
一、使用ProxyFactoryBean代理目标类的所有方法
在Spring中,ProxyFactoryBean是在XML中进行配置的。示例代码如下:
1 <?xml version = "1.0" encoding="UTF-8"?> 2 <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 3 "http://www.springframwork.org/dtd/spring-beans.dtd"> 4 <beans> 5 <bean id="log" class = "com.gc.action.LogAround"/> 6 <bean id="timeBook" class = "com.gc.action.TimeBook"/> 7 <!--设定代理类-->
<bean id="logProxy" class="org.springframework.aop.framework.ProxyFactoryBean"> 8 <!--这里代理的是接口--> 9 <property name="proxyInterfaces"> 10 <value>com.gc.impl.TimeBookInterface</value> 11 </property> 12 <!--程序中的Advice--> 13 <property name="target"> 14 <ref bean="timeBook"/> 15 </property> 16 <!--是ProxyFactoryBean要代理的目标类--> 17 <property name="interceptorNames"> 18 <list> 19 <value>log</value> 20 </list> 21 </property> 22 </bean> 23 </beans>
id为logProxy的Bean,就是ProxyFactoryBean
ProxyFactoryBean的proxyInterfaces属性:要代理的接口
ProxyFactoryBean的target属性:要代理的目标类,这个目标类实现了上面的接口
ProxyFactoryBean的interceptorNames属性:在代理的目标类中插入的Advice
ProxyFactoryBean的proxyTargetClass属性:true说明ProxyFactoryBean要代理的不是接口类,而是CGLIB方式来进行代理
使用ProxyFactoryBean代理目标类的指定方法
使用org.springframework.aop.support.RegexpMethodPointcutAdvisor类,示例代码如下:
1 <?xml version="1.0" encoding="UTF-8"> 2 <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> 3 <beans> 4 <bean id="log" class="com.gc.action.LogAround"/> 5 <bean id="timeBook" class="com.gc.action.TimeBook"/> 6 <bean id="logAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> 7 <property name="advice"> 8 <ref bean="log"/> 9 </property> 10 <!--指定要代理的方法--> 11 <property name="patterns"> 12 <value>.*doAuditing.*</value> 13 </property> 14 </bean> 15 <!--设定代理类--> 16 <bean id="logProxy" class="org.springframework.aop.framework.ProxyFactoryBean"> 17 <property name="proxyInterfaces"> 18 <value>com.gc.impl.TimeBookInterface</value> 19 </property> 20 <property name="target"> 21 <ref name="timeBook"/> 22 </property> 23 <property name="interceptorNames"> 24 <list> 25 <value>logAdvisor</value> 26 </list> 27 </property> 28 </bean> 29 </beans>
id为logAdvisor的Bean中设定Advice和要指定的方法。
logAdivsor的advice属性指定Advice
logAdvisor的patterns属性指定要代理的方法,patterns的属性值使用的是正则表达式