自动装配的spring bean不是代理

时间:2012-07-14 18:43:44

标签: spring service proxy target autowired

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

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

我有适当的东西:

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

但是,

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

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

由于

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:-4)

如果您使用的是Spring MVC,请确保在servlet上下文文件中单独扫描特定的控制器类。否则,它将扫描2次,并且在应用程序上下文中无法进行事务处理。