Spring 自动代理创建器详细介绍及简单实例
程序员文章站
2023-01-03 23:23:48
spring 自动代理创建器
前言:
在经典的spring aop中,可以手工为目标bean创建代理bean,配置文件必须为每一个需要增强的bean声明一个代理,结果配...
spring 自动代理创建器
前言:
在经典的spring aop中,可以手工为目标bean创建代理bean,配置文件必须为每一个需要增强的bean声明一个代理,结果配置文件里声明了大量的代理bean。
在经典的spring aop中,spring提供了自动代理创建器(aotu proxy creator),有了自动代理创建器,就不再需要使用proxyfactorybean手工地创建代理了。
接口animal和book:
package com.zzj.aop; public interface animal { public void eat(); public void drink(); }
package com.zzj.aop; public interface book { public void read(); }
目标类:
package com.zzj.aop; public class human implements animal, book{ @override public void eat() { system.out.println("eat..."); } @override public void drink() { system.out.println("drink..."); } @override public void read() { system.out.println("read..."); } }
前置通知和后置通知:
package com.zzj.aop; import java.lang.reflect.method; import org.springframework.aop.methodbeforeadvice; public class methodbefore implements methodbeforeadvice { public void before(method arg0, object[] arg1, object arg2) throws throwable { system.out.println("before " + arg0.getname()); } }
package com.zzj.aop; import java.lang.reflect.method; import org.springframework.aop.afterreturningadvice; public class methodafter implements afterreturningadvice { public void afterreturning(object arg0, method arg1, object[] arg2, object arg3) throws throwable { system.out.println( "after " + arg1.getname()); } }
spring配置文件:
<?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 定义目标对象 --> <bean id="human" class="com.zzj.aop.human"></bean> <!-- 定义通知 --> <bean id="beforeadvice" class="com.zzj.aop.methodbefore"></bean> <bean id="afteradvice" class="com.zzj.aop.methodafter"></bean> <!-- 定义切入点 --> <bean id="methodnamepointcut" class="org.springframework.aop.support.namematchmethodpointcut"> <property name="mappednames"> <list> <value>eat</value> <value>read</value> </list> </property> </bean> <!-- 定义后置增强器(关联通知和切入点) --> <bean id="aftermethodnameadvisor" class="org.springframework.aop.support.defaultpointcutadvisor"> <property name="advice" ref="afteradvice"></property> <property name="pointcut" ref="methodnamepointcut"></property> </bean> <!-- 定义前置增强器(关联通知和切入点) --> <bean id="beforemethodnameadvisor" class="org.springframework.aop.aspectj.aspectjexpressionpointcutadvisor"> <property name="advice" ref="beforeadvice"></property> <property name="expression"> <value>execution(* *.*in*(..))</value><!-- 可匹配drink --> </property> </bean> <!-- 定义自动代理创建器 --> <bean class="org.springframework.aop.framework.autoproxy.beannameautoproxycreator"> <property name="beannames"> <list> <value>*human</value> </list> </property> <property name="interceptornames"> <list> <value>aftermethodnameadvisor</value> <value>beforemethodnameadvisor</value> </list> </property> </bean> </beans>
以上自动代理器可以为以human结尾的bean创建代理。
测试:
package com.zzj.aop; import org.springframework.context.applicationcontext; import org.springframework.context.support.classpathxmlapplicationcontext; public class test { /** * @param args */ public static void main(string[] args) { applicationcontext context = new classpathxmlapplicationcontext( "applicationcontext.xml"); animal animal = (animal) context.getbean("human"); book book = (book) animal; animal.eat(); animal.drink(); book.read(); } }
输出:
eat... after eat before drink drink... read... after read
spring还提供了另一个自动代理创建器:defaultadvisorautoproxycreator。这个自动代理创建器不需要任何配置,他会自动检查ioc容器里声明的每一个增强器和bean。如果存在与增强器切入点匹配的的bean,那么defaultadvisorautoproxycreator将自动为其创建代理。
<bean class="org.springframework.aop.framework.autoproxy.defaultadvisorautoproxycreator"/>
需要注意的是,defaultadvisorautoproxycreator可能会代理那些不希望被代理的目标bean,所以使用时要格外小心。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
上一篇: ASP编程入门进阶(十):Global.asa文件
下一篇: ASP编程入门进阶(三):接触脚本程序