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,所以使用时要格外小心。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!