Spring 自动代理创建器详细介绍及简单实例
Spring自动代理创建器
前言:
在经典的springAop中,可以手工为目标Bean创建代理Bean,配置文件必须为每一个需要增强的Bean声明一个代理,结果配置文件里声明了大量的代理Bean。
在经典的SpringAop中,Spring提供了自动代理创建器(Aotuproxycreator),有了自动代理创建器,就不再需要使用ProxyFactoryBean手工地创建代理了。
接口Animal和Book:
packagecom.zzj.aop; publicinterfaceAnimal{ publicvoideat(); publicvoiddrink(); }
packagecom.zzj.aop; publicinterfaceBook{ publicvoidread(); }
目标类:
packagecom.zzj.aop; publicclassHumanimplementsAnimal,Book{ @Override publicvoideat(){ System.out.println("eat..."); } @Override publicvoiddrink(){ System.out.println("drink..."); } @Override publicvoidread(){ System.out.println("read..."); } }
前置通知和后置通知:
packagecom.zzj.aop; importjava.lang.reflect.Method; importorg.springframework.aop.MethodBeforeAdvice; publicclassMethodBeforeimplementsMethodBeforeAdvice{ publicvoidbefore(Methodarg0,Object[]arg1,Objectarg2) throwsThrowable{ System.out.println("before"+arg0.getName()); } }
packagecom.zzj.aop; importjava.lang.reflect.Method; importorg.springframework.aop.AfterReturningAdvice; publicclassMethodAfterimplementsAfterReturningAdvice{ publicvoidafterReturning(Objectarg0,Methodarg1,Object[]arg2, Objectarg3)throwsThrowable{ System.out.println("after"+arg1.getName()); } }
Spring配置文件:
<?xmlversion="1.0"encoding="UTF-8"?> <beansxmlns="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"> <!--定义目标对象--> <beanid="human"class="com.zzj.aop.Human"></bean> <!--定义通知--> <beanid="beforeAdvice"class="com.zzj.aop.MethodBefore"></bean> <beanid="afterAdvice"class="com.zzj.aop.MethodAfter"></bean> <!--定义切入点--> <beanid="methodNamePointcut" class="org.springframework.aop.support.NameMatchMethodPointcut"> <propertyname="mappedNames"> <list> <value>eat</value> <value>read</value> </list> </property> </bean> <!--定义后置增强器(关联通知和切入点)--> <beanid="AfterMethodNameAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor"> <propertyname="advice"ref="afterAdvice"></property> <propertyname="pointcut"ref="methodNamePointcut"></property> </bean> <!--定义前置增强器(关联通知和切入点)--> <beanid="BeforeMethodNameAdvisor" class="org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor"> <propertyname="advice"ref="beforeAdvice"></property> <propertyname="expression"> <value>execution(**.*in*(..))</value><!--可匹配drink--> </property> </bean> <!--定义自动代理创建器--> <beanclass="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <propertyname="beanNames"> <list> <value>*human</value> </list> </property> <propertyname="interceptorNames"> <list> <value>AfterMethodNameAdvisor</value> <value>BeforeMethodNameAdvisor</value> </list> </property> </bean> </beans>
以上自动代理器可以为以human结尾的Bean创建代理。
测试:
packagecom.zzj.aop; importorg.springframework.context.ApplicationContext; importorg.springframework.context.support.ClassPathXmlApplicationContext; publicclassTest{ /** *@paramargs */ publicstaticvoidmain(String[]args){ ApplicationContextcontext=newClassPathXmlApplicationContext( "applicationContext.xml"); Animalanimal=(Animal)context.getBean("human"); Bookbook=(Book)animal; animal.eat(); animal.drink(); book.read(); } }
输出:
eat... aftereat beforedrink drink... read... afterread
Spring还提供了另一个自动代理创建器:DefaultAdvisorAutoProxyCreator。这个自动代理创建器不需要任何配置,他会自动检查Ioc容器里声明的每一个增强器和Bean。如果存在与增强器切入点匹配的的Bean,那么DefaultAdvisorAutoProxyCreator将自动为其创建代理。
<beanclass="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
需要注意的是,DefaultAdvisorAutoProxyCreator可能会代理那些不希望被代理的目标Bean,所以使用时要格外小心。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!