spring aop失效场景
aop基于代理(jdk动态代理 / cglib代理)实现,即new了新的类实例,代理了原来的定义的类实例。
目录
- 1. final修饰的方法无法被代理
- 2. 静态方法无法被代理
- 3. 内部方法调用,即this.method()无法被代理
- 4. 私有方法不能代理
- 5. 忘记加@EnableAspectJAutoProxy或@Aspect了也无法完成代理
- 6. 不使用Spring的对象无法完成代理
- 其它。。。
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
- 代理方法内部嵌套不会多次代理
@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,符合预期
其它。。。
写的切面类是否有什么错误了