首页   快速返回

spring aop 内部方法调用拦截说明     所属分类 spring
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自动装配实例