9

我正在开发一个连接到 MySQL 数据库的非常小的应用程序。

我正在尝试创建表记录,但得到“没有正在进行的事务”。

我有所有正确的东西:

  • 服务接口 MyService 及其实现 MyServiceImpl
  • 我已经用@Service 注释了服务实现
  • 在控制器中,我使用了 @Autowired MyService 字段的接口名称
  • 我有正确的事务配置,因为它最初是由 roo 生成的
  • MyServiceImpl 实现了一个公共方法 MyService.create(...)

但,

当我远程调试并检查控制器的 myService 字段时,我看到的是 com.some.package.services.MyService@12345 (而不是 $Proxy73 之类的东西),这对我来说是不对的,因为应该自动连接的是代理不是他的目标豆(这就是我认为的)。如果我是正确的,那么没有事务是有道理的,因为只有在代理上调用使用 @Transactional 注释的公共方法时,注释才会生效。

请告诉我为什么 spring 在这个设置中注入目标 bean。

谢谢

4

2 回答 2

8

如果您有启用 AspectJ 的事务管理 ( <tx:annotation-driven mode="aspectj" .../>),事务的应​​用程序就地发生在同一个类中,无论是在构建期间(编译时编织)还是在启动时(加载时编织)。

没有创建新的类(比如使用时),也没有代理(比如 Spring 中基于接口的普通 AOP)。相反,字节码MyServiceImpl被直接修改了,您甚至都没有注意到。不幸的是,查看 AOP 的唯一方法是反编译您的类。如果您使用javap -c MyServiceImpl,您会发现大量对 Spring 事务层的引用。

于 2012-07-14T21:32:46.810 回答
-3

如果您使用 Spring MVC,请确保仅在 servlet 上下文文件中扫描特定的控制器类。否则它将扫描 2 次并且事务在应用程序上下文中不可用。

于 2012-10-15T06:45:41.447 回答