一 问题
我们在使用spring的注解时,稍不注意就很有可能会遇到注解没有生效的情况,比如下面这段代码,在发生类内调用时就出现了问题,
import org.springframework.stereotype.Component;
@Component
public class HelloService {
@Transactional
public void sayHi(String msg) {
//数据库操作
doSomethingInDB();
System.out.println("\tsayHi:" + msg);
throw new RuntimeException();
}
public void anotherSayHi(String msg) {
this.sayHi(msg);
}
}
运行上面这段代码我们会发现,直接调用 sayHi()方法,事务有进行回滚操作,但是调用 anotherSayHi()方法时,事务注解却没有生效。
二 分析
这是什么原因呢?
显然HelloService中的anotherSayHi方法,并未被aop增强。 了解AOP原理的同学想必都知道,AOP的实现有二类,如果是基于接口的,会采用动态代理,生成一个代理类,如果是基于类的,会采用CGLib生成子类,然后在子类中扩展父类中的方法。然后在代理类中对原有方法进行增强。我们直接通过this去调用类内的 sayHi()方法,这种方式是