通过使用DefaultAdvisorAutoProxyCreator,我没只需要提供相应的通知者advisor,就可以通知applicationContext中的任何Bean,如果一个bean在applicationContext中没有实用的通知者,也就是说他不匹配任何一个通知者的切入点,那么DefaultAdvisorAutoProxyCreator就不会创建这个bean的代理
Bean:
package ch7.DefaultAdvisorAutoProxyCreator;

public class BeanOne ...{
public void foo()...{
System.out.println("foo1");
}
}

package ch7.DefaultAdvisorAutoProxyCreator;

public class BeanTwo ...{
public void foo()...{
System.out.println("foo2");
}
}
MyPointCut
package ch7.DefaultAdvisorAutoProxyCreator;
import org.springframework.aop.ClassFilter;
import org.springframework.aop.MethodMatcher;
import org.springframework.aop.Pointcut;

public class MyPointCut implements Pointcut ...{
//匹配BeanOne
public ClassFilter getClassFilter() ...{
return new ClassFilter()...{
public boolean matches(Class cls)...{
return (cls==BeanOne.class);
}
};
}
//匹配所有方法
public MethodMatcher getMethodMatcher() ...{
return MethodMatcher.TRUE;
}
}
SimpleAdvise.java
package ch7.DefaultAdvisorAutoProxyCreator;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class SimpleAdvise implements MethodInterceptor ...{

public Object invoke(MethodInvocation invocation) throws Throwable ...{
System.out.println("before");
Object retVal=invocation.proceed();
System.out.println("after");
return retVal;
}
}
测试代码:
package ch7.DefaultAdvisorAutoProxyCreator;
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("ch7/DefaultAdvisorAutoProxyCreator/applicationContext.xml");
BeanOne one=(BeanOne)context.getBean("beanOne");
BeanTwo two=(BeanTwo)context.getBean("beanTwo");
one.foo();
two.foo();
}
}
结果:
before
foo1
after
foo2
可以看到two不是代理对象,如果打印 System.out.println(AopUtils.isAopProxy(two));结果也为false
本文介绍了如何使用 Spring 的 DefaultAdvisorAutoProxyCreator 来实现面向切面编程 (AOP),并通过一个具体的例子展示了如何为特定的 Bean 创建代理,并在调用方法前后添加额外的行为。
1568

被折叠的 条评论
为什么被折叠?



