现象:在同一个类中,方法a去调用含有@Async或@Transational注解的方法b,@Async或@Transational不起作用。
原因:含有@Async或@Transational注解的bean被spring扫描时,spring会为其生成一个代理类,代理类继承原来的目标bean,如果该注解作用在方法上,则会重写目标bean对应方法,将该方法做相应的增强(如果该注解是作用在类上,则会增强该类的所有方法)。而方法a不含@Async或@Transational,所以不会增强处理,所以方法a是直接调用方法b,导致@Async或@Transational失效。
伪代码简单表示:
// 目标类
@Service
Class Target{
public void a(){
b();
}
@Async
public void b(){
}
}
Spring 扫描到方法b上面的@Async注解,会为其生成一个代理类
// 代理类
Class proxy{
public void a(){
// 这里调用的就不是代理对象中的方法b,而是原来目标对象的方法b
target.b();
}
@Async
public void b(){
// 增强
....
target.b();
}
}