The bean ‘X‘ could not be injected as a ‘X‘‘ because it is a JDK dynamic proxy that implements

文章讲述了在Java项目中新增功能时遇到的启动失败问题,由于@Autowired默认按类型装配而@Resource按名称装配,导致了名称冲突。解决方法包括使用@Autowired指定名称或修改变量名避免冲突。
摘要由CSDN通过智能技术生成

🍓 简介:java系列技术分享(👉持续更新中…🔥)
🍓 初衷:一起学习、一起进步、坚持不懈
🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏
🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝

🍓 更多文章请点击
在这里插入图片描述在这里插入图片描述

一、问题描述

新增一个功能需求后,项目无法启动成功,报错如下

2024-03-11 11:40:08.630 [main] ERROR o.s.b.diagnostics.LoggingFailureAnalysisReporter - [report,40] - 

***************************
APPLICATION FAILED TO START
***************************

Description:

The bean 'userInfoBaseMapper' could not be injected as a 'com.test.mapper.UserInfoBaseTwoMapper' because it is a JDK dynamic proxy that implements:


Action:

Consider injecting the bean as one of its interfaces or forcing the use of CGLib-based proxies by setting proxyTargetClass=true on @EnableAsync and/or @EnableCaching.

二、原因分析:

根据Idea中的处理意见,发现还是不明白其中的原理。我也只用了@Resource注解而已,所以我将注解修改为@Autowired就可以启动正常了,为什么呢?


在我的印象中他两的区别,有多个同类型的Bean时@Resource 更加简单,如下,怎么会引起报错呢?

	// 使用@Resource
	@Resource(name = "myBean")
	private MyBean myBean;
	
	// 使用@Autowired
	@Autowired
	@Qualifier("myBean")
	private MyBean myBean;

那么首先从两者的区别来研究:首先要清楚,@Resource和@Autowired 注入原理到底有什么区别

2.1 注入原理:

@Autowired

  • 首先按照类型进行注入
  • 如果spring容器中 存在同一个类型的多个bean ,那么此时在进行注入的时候按照 属性的名称 进行注入

@Resource

  • @Resource 可以按照名称或者类型进行注入。默认按照名称进行匹配

看到这里恍然大悟,原来是@Resource导致的错误

因为@Autowired默认按类型装配,而 @Resource优先按名称 装配,如果使用@Resource 注入userInfoBaseMapper,而项目中有另外一个bean叫userInfoBaseMapper,就会出现这个错误。
两个不同的引用,用了同一个名字,导致注入错误。

在这里插入图片描述

三、解决方案

3.1 第一种

  • 使用@Autowired,
  • 首先按照类型进行注入,存在同一个类型的多个bean,则按照名称注入,则不存在冲突

	@Autowired
    private UserInfoBaseTwoMapper userInfoBaseMapper;
    

3.2 第二种

  • @Resource注解不变(默认按照名称进行匹配),

  • 修改变量名,使变量名不与其他类型相同,这里将userInfoBaseMapper改为userInfoBaseTwoMapper则启动正常

    @Resource
    private UserInfoBaseTwoMapper userInfoBaseTwoMapper;

在这里插入图片描述在这里插入图片描述

  • 27
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dream_sky分享

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值