我正在研究一个很小的连接到MySQL数据库的应用程序。
我正在尝试创建表记录,但是“没有正在进行的交易”。
我拥有所有正确的东西:
服务接口MyService及其实现MyServiceImpl
我已经用@Service注释了服务隐含
在控制器中,我将接口名称用于@Autowired MyService字段
我具有正确的事务配置,因为它最初是由roo生成的
有一个MyServiceImpl实现的公共方法MyService.create(...)
但,
当我进行远程调试并检查控制器的myService字段时,我看到的类似于
com.some.package.services.MyService@12345(以及类似$ Proxy73的东西)对我来说是不对的,因为应该自动装配的是代理而不是目标Bean(我认为这就是目标)。如果我是正确的,那么就没有事务是有道理的,因为只有在调用代理上带有@Transactional注释的公共方法时,注释才会启动。
请告诉我为什么在这种设置中春季注入了目标豆。
谢谢
最佳答案
如果您具有启用AspectJ的事务管理(<tx:annotation-driven mode="aspectj" .../>
),则在构建(编译时编织)过程中或在启动(加载时编织)过程中,在同一类中就地进行事务应用。
没有创建新类(如使用cglib时),也没有代理(如Spring中基于普通接口的AOP)。相反,MyServiceImpl
的字节码被直接修改,甚至没有引起您的注意。不幸的是,查看AOP的唯一方法是反编译您的类。如果使用javap -c MyServiceImpl
,您会发现大量对Spring事务层的引用。