SpringBoot 没有为 Service 创建代理类的一个原因

最近一个 SpringBoot 项目,最开始需要在一个 Service 中使用 AopContext.currentProxy(),谁知返回一个空,导致空指针异常

再跟踪发现,原来 spring 并没有为这个 Service 创建代理类,所有对这个类型的注入,都是直接创建这个 Service 实现类的对象。

网上找了一堆文章,千篇一律的说要要启动类上加上注解:

@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)

按照文章里说的,把注解加上去了,但一点用都没有,Service 依然没有创建代理类

把代码精简,放到其它正常的工程里,问题依然存在。但其它模块的 Service 都是代理类型,就是我的 Service 不同。
好办多了,经过一行一行代码比较,终于发现,只要在我的 Serivce 实现类或者实现类的任意一个 public 方法加上 @Transactional 注
解,spring 就会为它创建代理类

仔细思考一下,这个规则其实也很合理:如果 Service 没有 @Tranactional 注解,就说明这个 service 实现里不打算启用事务,或者是打算手动管
理事务,既然如此,就完全没有必要做代理了嘛。这就象是,如果我要过户一套房子,而所有手续都由我自己搞定,我就没必要找中介办理了。

 

posted on 2022-10-28 17:05  背锅狼  阅读(421)  评论(0)    收藏  举报