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,所以使用时要格外小心。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!