Bootstrap

spring aop失效场景

aop基于代理(jdk动态代理 / cglib代理)实现,即new了新的类实例,代理了原来的定义的类实例。

1. final修饰的方法无法被代理

当有如下aop的时候:

@Aspect
@Component
public class LogInterceptor {

	@After("execution(public * com.dq.service..*.func(..))")
	public void beforeFunc() {
		System.out.println("aop after func...");
	}

}

如下测试
在这里插入图片描述
final修饰的func方法没有被代理,另外一个func方法正常代理

2. 静态方法无法被代理

public static void func(String a, String b) {
    String c = a + "|" +  b;
    System.out.println("func..." + c);
}

在这里插入图片描述
因为静态方法是属于类的,不属于对象实例

3. 内部方法调用,即this.method()无法被代理

public void func(int a, int b) {
       int c = a + b;
       System.out.println("func..." + c);
   }

   public void useFunc() {
       System.out.println("use func...");
       func(1,2);
   }

在这里插入图片描述

useFunc方法调用了可以被代理的func(int a, int b)方法,单独执行func(int a, int b)可以代理,但是内部this.func(int a, int b)这么调用用的是原来的实例,不是代理实例的,无法完成代理行为

4. 私有方法不能代理

这是显然的,私有方法一般是内部的一些逻辑转换方法,不对外使用

5. 忘记加@EnableAspectJAutoProxy或@Aspect了也无法完成代理

可能一切都是都是对的,但是没有加@Aspect

//@Aspect
@Component
public class LogInterceptor {

	@After("execution(public * com.dq.service..*.func(..))")
	public void beforeFunc() {
		System.out.println("aop after func...");
	}

}

那显然无法代理

6. 不使用Spring的对象无法完成代理

如下,自己new的显然不行。必然是spring代理后的对象,显然要取那个代理bean
在这里插入图片描述

  1. 代理方法内部嵌套不会多次代理
@Component("testService")
public class TestService {

    public void func(String a, String b) {
        String c = a + "|" +  b;
        System.out.println("func..." + c);
    }

    public void func(int a, int b) {
        int c = a + b;
        System.out.println("func..." + c);
        func("a","b");
    }


}

在这里插入图片描述

嵌套方法不会多次aop,符合预期

其它。。。

写的切面类是否有什么错误了

;