spring aop 内部方法调用拦截说明
所属分类 spring
浏览量 1356
Java 配置类 内部方法 可以被拦截
@Configuration("config")
public abstract class Config{
@Bean
protected User user(){
return new User();
}
// method 'user2' must not be private or final
@Bean("user2")
protected User user2(){
return user();
}
}
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(Config.class);
// ctx.addApplicationListener(new MyApplicationListener());
ctx.refresh();
User user = (User)ctx.getBean("user");
System.out.println("user="+user);
System.out.println(user.getName());
User user2 = (User)ctx.getBean("user2");
System.out.println("user2="+user2);
System.out.println(user.getName());
user user2 是同一个对象 ,说明拦截生效了
普通bean的 内部调用则不会拦截
@Aspect
@Component
public class InternalInvokeAspect{
@Pointcut("execution(* aop.InternalInvokeTest.*(..))")
private void log() {}
@Before("log()")
public void doBefore(JoinPoint joinPoint) {
System.out.println("InternalInvokeAspect.doBefore run,joinPoint="+joinPoint);
}
}
@Component("internalInvokeTest")
public class InternalInvokeTest{
public void method1(){
System.out.println("InternalInvokeTest.method1() run "+new Date());
}
public void method2(){
System.out.println("InternalInvokeTest.method2() run "+new Date());
method1();
}
}
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(Config.class);
ctx.refresh();
InternalInvokeTest test = (InternalInvokeTest)ctx.getBean("internalInvokeTest");
test.method1();
System.out.println("******");
test.method2();
InternalInvokeAspect.doBefore run,joinPoint=execution(void aop.InternalInvokeTest.method1())
InternalInvokeTest.method1() run Wed Jun 18 19:38:49 CST 2019
******
InternalInvokeAspect.doBefore run,joinPoint=execution(void aop.InternalInvokeTest.method2())
InternalInvokeTest.method2() run Wed Jun 18 19:38:49 CST 2019
InternalInvokeTest.method1() run Wed Jun 18 19:38:49 CST 2019
method2 内部调用 method1 ,拦截没有生效
普通代理类 方法 调用 super.xxx , 因此内部调用 无法拦截
spring aop cglib 代理类源码查看
上一篇
下一篇
spring aop 与 aspectj的区别和联系
基于Aspect注解的spring aop 实例
AOP知识点
spring aop cglib 代理类源码查看
Properties使用UTF8读取中文配置文件
spring5自动装配实例