我正在开发一个连接MySQL数据库的非常小的应用程序。
我正在尝试创建表记录但是“没有正在进行的事务”。
我有适当的东西:
但是,
当我远程调试并检查控制器的myService字段时,我看到的是类似的东西 com.some.package.services.MyService@12345(而不是像$ Proxy73那样)对我来说是不对的,因为应该自动装配的是代理而不是他的目标bean(我认为这是)。如果我是正确的,那么没有事务是有意义的,因为注释只会在调用在代理上使用@Transactional注释的公共方法时启动。
请告诉我为什么spring在此设置中注入目标bean。
由于
答案 0 :(得分:7)
如果您启用了支持AspectJ的事务管理(<tx:annotation-driven mode="aspectj" .../>
),则在构建(编译时编织)或启动期间,在同一个类中的事务应用程序就地发生(加载时编织。
没有创建新类(比如使用cglib时)和没有代理(比如Spring中基于普通接口的AOP)。相反,MyServiceImpl
的字节码被直接修改,你甚至没有注意到。不幸的是,查看AOP的唯一方法是反编译你的类。如果使用javap -c MyServiceImpl
,您会发现大量对Spring事务层的引用。
答案 1 :(得分:-4)
如果您使用的是Spring MVC,请确保在servlet上下文文件中单独扫描特定的控制器类。否则,它将扫描2次,并且在应用程序上下文中无法进行事务处理。