先要了解spring容器初始化过程中Bean的生命周期:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210508145415890.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2thaWthaWppbg==,size_16,color_FFFFFF,t_70#pic_center)
如果spring在启动过程中加上了@Transiation注释的话,spring会生成一个代理对象,来做事务控制。我们从容器中取出来的对象是代理对象,代理对象在执行方法之前会开启事务管理控制。
类X中的方法A 调用方法 B, A 方法没有设置事务, B 方法设置了事务, 但经过测试 B的事务并没有生效。
Spring在创建一个Bean之后,对其包装并生成动态代理对象都是后置的举动,故会先生成真实类的实例bean,再动态创建动态代理bean,在动态代理bean中,会持有真实的bean的实例。
而我们在类中的方法直接调用, 实际上是真实类的实例调用, 并不是代理的bean的实例。