【问题标题】:Autowired spring bean is not a proxy自动装配的 spring bean 不是代理
【发布时间】:2012-07-14 05:50:53
【问题描述】:

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

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

我已经准备好了所有合适的东西:

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

但是,

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

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

谢谢

【问题讨论】:

  • MyServiceImpl 是否用@Transactional 注释? XML 中有<tx:annotation-driven/> 吗?
  • 感谢您的回复,是的,我有

标签: spring service proxy target autowired


【解决方案1】:

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

【讨论】:

  • 请停止到处发布相同的复制/粘贴答案。尽量确保它与当前问题真正相关。
【解决方案2】:

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

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

【讨论】:

  • 谢谢 Tomasz,你说的很有道理,所以谢谢你。我反编译的类就是你的意思: AnnotationTransactionAspect.aspectOf().ajc$before$org_springframework_transaction_aspectj_AbstractTransactionAspect$1$2a73e96c(this, ajc$tjp_0); localJobSpec1 = (JobSpec)super.create(jobSpec); } catch (Throwable localThrowable) { AnnotationTransactionAspect.aspectOf().ajc$afterThrowing$org_springframework_transaction_aspectj_AbstractTransactionAspect$2$2a73e96c(this, localThrowable);抛出本地Throwable; } AnnotationTransactionAspect.aspectOf().ajc$after 等
猜你喜欢
  • 2018-05-01
  • 1970-01-01
  • 2016-09-27
  • 1970-01-01
  • 2020-09-09
  • 2018-06-15
  • 2017-01-23
  • 1970-01-01
  • 2012-12-04
相关资源
最近更新 更多