前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >because it is a JDK dynamic proxy that implements问题 看这一篇就够了

because it is a JDK dynamic proxy that implements问题 看这一篇就够了

作者头像
明明如月学长
发布2021-08-31 15:20:52
3.8K1
发布2021-08-31 15:20:52
举报
文章被收录于专栏:明明如月的技术专栏

一、背景

开发中常见这个错误:

The bean 'xxxService' could not be injected as a'com.xxxx.xxx.xxxService' because it is a JDK dynamic proxy that implements: xxxxxx Action: Consider injecting the bean as one of its interfaces orforcing the use of CGLib-based proxiesby setting proxyTargetClass=true on @EnableAsync and/or @EnableCaching.

二、常见解决方案

主要配置基于JDK的代理还是基于类的动态代理的配置,这种错误提示需要设置基于类的代理才行。

比如单元测试里注入了实现类,且实现类里有@Transaction注解

如果是springboot项目,在配置里设置

代码语言:javascript
复制
spring.aop.proxy-target-class=true

proxy-target-class属性值决定是基于JDK接口还是基于类的代理被创建。

如果为true代表基于类的代理,

如果为false代表基于JDK接口的代理。

或者在配置类上设置

代码语言:javascript
复制
@EnableAspectJAutoProxy(proxyTargetClass = true)

当然另外的几个注解都支持

@EnableAsync

@EnableCaching

或者

代码语言:javascript
复制
@EnableTransactionManagement (proxyTargetClass = true)

都可以设置proxyTargetClass = true属性

根据自己的情况选择,

@EnableAspectJAutoProxy单纯设置基于类的动态代理,其他的都是开启异步,开启缓存,开启事务管理等注解顺便开启基于类的动态代理。

三、其他问题引起

3.1 另外多半是使用@Resource注解导致的问题

因为@Autowired默认按类型装配,而 @Resource优先按名称装配,如果使用

代码语言:javascript
复制
@Resource
private XabYcdService ycdSerivce;

恰巧有另外一个bean叫“ycdSerivce” 也可能出现这个错误。

3.2  粗心导致

比如基于xml的配置

代码语言:javascript
复制

这里的class并不是实际应该配置的:com.xxx.xxx.xxx.xxXabYcdService

如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/05/22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、背景
  • 二、常见解决方案
    • 三、其他问题引起
      • 3.1 另外多半是使用@Resource注解导致的问题
        • 3.2  粗心导致
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档