spring aop的自动代理
BeanNameAutoProxyCreator为名字匹配字符串或者通配符的bean自动创建AOP代理。
通知
配制
test
定义pointcut
配制
<beans><bean id="proxyCreator"><bean id="autoBean" class="aop2.AutoBean"><bean id="otherBean" class="aop2.OtherBean"><bean id="advisor"> <property name="pointcut">
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="proxyCreator">
class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
<bean id="autoBean" class="aop2.AutoBean">
<bean id="otherBean" class="aop2.OtherBean">
<bean id="advisor">
class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="pointcut">
<bean class="aop2.MyPointcut">
</bean>
<property name="advice">
<bean class="aop2.SimpleBeforeAdvice">
</bean>
</property>
</property>
<bean class="aop2.MyPointcut">
</bean>
<property name="advice">
<bean class="aop2.SimpleBeforeAdvice">
</bean>
</property>
</bean> </bean></bean></bean></beans></property> </bean></bean></bean></bean></beans>
BeanNameAutoProxyCreator为名字匹配字符串或者通配符的bean自动创建AOP代理。
java 代码
- public class AutoBean {
- public void foo() {
- System.out.println("foo()");
- }
- }
java 代码
- package aop;
- import java.lang.reflect.Method;
- import org.springframework.aop.MethodBeforeAdvice;
- public class SimpleBeforeAdvice implements MethodBeforeAdvice{
- public void before(Method method, Object[] arg1, Object arg2) throws Throwable {
- System.out.println("Bofore method:"+ method );
- }
- }
java 代码
- "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
- <beans> </beans>
- class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
- <list> </list>
- <value>foo*</value>
- <value>barBean</value>
- <list> </list>
- <value>advice</value>
test
java 代码
- package aop;
- import org.springframework.aop.support.AopUtils;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.FileSystemXmlApplicationContext;
- public class IntroductionConfigExample {
- public static void main(String[] args) {
- ApplicationContext ctx = new FileSystemXmlApplicationContext(
- "./src/beans.xml");
- AutoBean autoBean = (AutoBean)ctx.getBean("fooBean");
- AutoBean autoBean1 = (AutoBean)ctx.getBean("barBean");
- // OtherBean otherBean = (OtherBean)ctx.getBean("otherBean");
- autoBean.foo();
- System.out.println(AopUtils.isAopProxy(autoBean));
- // otherBean.foo();
- // System.out.println(AopUtils.isAopProxy(otherBean));
- }
- }
DefaultAdvisorAutoProxyCreator
一个更加通用而且强大得多的自动代理创建器是DefaultAdvisorAutoProxyCreator
。它自动应用当前上下文中适当的advisor,无需在自动代理advisor的bean定义中包括bean的名字。 比起BeanNameAutoProxyCreator
,它提供了同样关于一致性配置的优点而避免了前者的重复性。
可以向每个业务对象应用任意数量的advisor。对于一个业务对象,如果没有任何advisor中的切入点匹配它的任何方法,这个对象将不会被代理。
java 代码
- package aop2;
- public class AutoBean {
- public void foo() {
- System.out.println("foo()");
- }
- }
java 代码
- package aop2;
- public class OtherBean {
- public void foo() {
- System.out.println("foo()");
- }
- }
java 代码
- package aop2;
- import java.lang.reflect.Method;
- import org.springframework.aop.MethodBeforeAdvice;
- public class SimpleBeforeAdvice implements MethodBeforeAdvice{
- public void before(Method method, Object[] arg1, Object arg2) throws Throwable {
- System.out.println("Bofore method:"+ method );
- }
- }
java 代码
- package aop2;
- import org.springframework.aop.ClassFilter;
- import org.springframework.aop.MethodMatcher;
- import org.springframework.aop.Pointcut;
- public class MyPointcut implements Pointcut {
- public ClassFilter getClassFilter() {
- return new ClassFilter() {
- public boolean matches(Class cls) {
- return (cls == AutoBean.class); //只代理autobean
- }
- };
- }
- public MethodMatcher getMethodMatcher() {
- return MethodMatcher.TRUE;
- }
- }
java 代码
- package aop2;
- import org.springframework.aop.support.AopUtils;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.FileSystemXmlApplicationContext;
- public class DefaultCreatorExample {
- public static void main(String[] args) {
- ApplicationContext ctx = new FileSystemXmlApplicationContext(
- "./src/beans1.xml");
- AutoBean autoBean = (AutoBean)ctx.getBean("autoBean");
- OtherBean otherBean = (OtherBean)ctx.getBean("otherBean");
- autoBean.foo();
- System.out.println(AopUtils.isAopProxy(autoBean));
- otherBean.foo();
- System.out.println(AopUtils.isAopProxy(otherBean));
- }
- }
<beans><bean id="proxyCreator"><bean id="autoBean" class="aop2.AutoBean"><bean id="otherBean" class="aop2.OtherBean"><bean id="advisor"> <property name="pointcut">
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="proxyCreator">
class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
<bean id="autoBean" class="aop2.AutoBean">
<bean id="otherBean" class="aop2.OtherBean">
<bean id="advisor">
class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="pointcut">
<bean class="aop2.MyPointcut">
</bean>
<property name="advice">
<bean class="aop2.SimpleBeforeAdvice">
</bean>
</property>
</property>
<bean class="aop2.MyPointcut">
</bean>
<property name="advice">
<bean class="aop2.SimpleBeforeAdvice">
</bean>
</property>
</bean> </bean></bean></bean></beans></property> </bean></bean></bean></bean></beans>