自动装配的Spring bean是不是代理(Autowired spring bean is not

2019-07-30 10:36发布

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

我试图创建表的记录,但得到“没有进行中的交易”。

我已经具备了所有正确的东西:

  • 服务接口为MyService及其实现MyServiceImpl
  • 我已经标注了@Service服务IMPL
  • 在控制器我使用的接口名称领域@Autowired为MyService
  • 我有正确的交易结构,因为它最初是由袋鼠产生
  • 有哪些MyServiceImpl实现了一个公共的方法MyService.create(...)

但,

当我远程调试和检查控制器的为myService场我所看到的是一样的东西com.some.package.services.MyService@12345(不是类似$ Proxy73),这对我来说是不正确的,因为什么应该被装配是代理他没有目标bean(这是我认为这是)。 如果我是正确的,那么它是有道理的,没有事务作为注释调用与@Transactional上的代理注释公共方法时只会一命呜呼

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

谢谢

Answer 1:

如果启用了AspectJ的有事务管理( <tx:annotation-driven mode="aspectj" .../>交易的应用发生在就地在同一个班级,无论是在生成过程(编译时编织),或在启动时(加载时织入)。

没有新的类中创建(当使用像CGLIB和)无代理(像春天一般的基于接口的AOP)。 取而代之的字节码MyServiceImpl直接修改没有你甚至没有注意到。 不幸的是,看AOP的唯一方法是进行反编译你的类。 如果您使用javap -c MyServiceImpl你会发现很多引用到Spring的事务层。



Answer 2:

如果您在使用Spring MVC,一定要单独扫描servlet上下文文件中的特定控制器类。 否则,它会扫描2次,成交不提供应用程序上下文。



文章来源: Autowired spring bean is not a proxy