背景介绍
在使用@Async注解时,发现在本类中调用的方法异步注解失效了,实际上还是同步调用,后定位是Spring的AOP实现方式,导致注解没有生效。
动态代理两种方式
Spring实现动态代理有两种方式,JDK代理和CGLIB代理。
使用JDK还是CGLIB
1)当Bean实现接口时,Spring就会用JDK的动态代理。
2)当Bean没有实现接口时,Spring使用CGlib是实现。
3)可以强制使用CGlib(在spring配置中加入<aop:aspectj-autoproxy proxy-target-class=“true”/>)。
JDK代理和CGLIB代理实现原理
可见我的另一篇博客
JDK代理和CGLIB代理
代码详解
接口:
interface Demo{
int add(int, int);
int addOne(int);
}
实现类:
class Real implements Demo {
@Override
public int add(int x, int y) {
int res = x + y + this.addOne();
return res;
}
@Override
@Async
public int addOne(int x) {
Thread.sleep(2000);
return x + 1;
}
}
这里我们在add方法中调用本类的addOne方法。
我们引出jdk代理的实