1.先看示例代码
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
@Controller
@RequestMapping("acontroller")
public class AController {
@Autowired
private AService aService;//这一步注入的是代理类
@RequestMapping("test")
public String test(){
aService.insertA();
return "ok";
}
}
@Component
public class AService {
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void insertA(){
selectA();
System.out.println("哈哈");
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void selectA(){
System.out.println("哈哈");
}
}
先看AController里的调用, 首先因为AService使用了事务注解,那么注入spring容器的bean会是jdk动态代理后的bean, 那么调用aService.insertA();实际是调用动态代理对象的insertA()方法, 而根据jdk动态的实现,会将切面按照before / invoke原方法 / after....顺序实现, 此处在调用invoke的时候会调用AService(原生类,而非代理类)类中的insertA()方法,那么原生对象的insertA方法又会调用selectA方法,相当于this.selectA(),那么此处的this是当前类,即AService原生类,所以不会再走代理了.
整个链路参考下图(网图,侵删).