关于springboot项目中server层报错信息:Could not autowire. No beans of ‘GateLogDao‘ type found引发的思考

前言

这两天看公司的另外一个项目中service层使用的@Autowired注解,但是idea检测后报错了,虽然这个错误不影响整个项目的正常运行,但是喜欢探究的我还是决定一探究竟。
在这里插入图片描述
所以就有了自己的探究,之所以自己要去探究这个问题,也是自己的这块内容的不扎实导致的,现在很多内容都被封装了,导致我们对底层的原理并不是很清楚,自己也还没有静下心来好好去看看源码,今天就稍作学习吧。

一、换成@Resource后

在这里插入图片描述
这样就报错了,所以问题就来了,关于autowired和resouce注解的区别,网上也有很多类似的文章,我 就不赘述了。
我就提一点区别:
@Autowired(org.springframework.beans.factory.annotation.Autowired):由spring提供,只按照byType注入
@Resource(javax.annotation.Resource):由JSR-250规范中的J2EE提供,默认是按照byName自动注入

补充:JSR规范相关文章:
老生常谈-JSR规范
Java的JSR规范

二、依旧使用Resource但不报错

网上有些是调整idea对注解的检测级别,但我个人认为这不是解决问题的根本,因为其他的地方也是用Autowired注入的,为啥没有报错,所以我就只想从代码层面去解决这个问题,看了一下需要添加一个组件注解。
在这里插入图片描述
添加后就不报错了
在这里插入图片描述
但为啥添加完Component就不报错了呢?

三、Mapper注解探究

@Mapper 是 Mybatis 的注解,和 Spring 没有关系,在 Spring 程序中,Mybatis 需要找到对应的 mapper,在编译的时候动态生成代理类,实现数据库查询功能,所以我们需要在接口上添加 @Mapper 注解。
看到这里是不是想到了什么?没错,autowired是spring的注解,要想将GateDogDao注入到spring中,必须添加Component注解,而仅仅添加@Mapper注解是不行的,因为Mapper注解是Mybatis注解,和spring没关系,所以在GateLogDao上添加一个Component注解后,就注入到了Spring中,自然就可以和Autowired一起使用,至于底层代码,感兴趣的可以自己找找资料再去查看。我就不多说了,涉及的类可以看AutowiredAnnotationBeanPostProcessor

四、Resource注解探究

再来说说使用Resouce注解为啥不报错,我们看一下Resource注解所在包
在这里插入图片描述

这个是JSR规范中rt包下的,

注解下面有一段话:
在这里插入图片描述
翻译过来就是:
资源的JNDI名称。对于字段注释,默认值为字段名称。对于方法注释,缺省值为与该方法相对应的JavaBeans属性名称。对于类注释,没有默认值,必须指定它。

这个注解和spring没有关系,不受spring管理也可以自动注入,默认是按照名称注入,也可以按照类型注入,所以即便GateLogDao类没有Component注解也不会报错。
发现的一个现象就是现在公司的老项目都是用的Autowired注解,而不是Resource注解,主要是考虑到springcloud项目中用spring会更好的兼容,当然这个看个人和公司习惯,用Resource的话可以和spring进行解耦,这样一旦spring改变了,也不需要改动太多的代码。

以上也是对自己这块知识的盲区的一个补充,有不对的地方,还望留言指正。

-------------你知道的越多,不知道的越多--------------

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误可能是因为你在使用 @Autowired 注入 Bean 时,Spring 找不到合适的 Bean 来进行注入。可能是因为你在使用 @Mapper 注解的类没有在 Spring 的配置文件进行扫描导致的。请确认是否在 Spring 的配置文件配置了扫描 mapper 包的语句。 ### 回答2: 当我们在使用Spring框架进行开发时,经常会使用到自动装配(Autowiring)来实现依赖注入(Dependency Injection)。当出现“Could not autowire. No beans of 'xxxx' type found”这个错误提示时,意味着Spring无法找到与指定类型相匹配的Bean。 针对该问题,通常有以下几种可能的解决方案: 1. 检查是否正确配置了相关的注解:需要使用`@Mapper`注解对目标类进行标记,以便MyBatis框架能够正确识别并生成Bean实例。确保在类上方正确地添加了该注解。 2. 确认相关的类和接口是否被正确扫描:Spring框架默认会扫描指定包及其子包的所有类和接口,以便自动装配。请确保目标类所在的包已经被正确地扫描到。可以使用`@ComponentScan`注解来设置扫描路径。 3. 检查Java配置类的正确性:如果使用Java配置类,需要使用`@Configuration`注解标记该类,并确保在配置类正确地进行了Bean的定义和初始化。检查该配置类是否被正确地加载到应用程序。 4. 确保相关依赖已经添加到项目:请检查项目的依赖配置文件(如pom.xml)或相关的构建工具配置文件,确保引入了MyBatis相关的依赖。如果相关依赖未正确添加,可能导致Spring无法找到正确的Bean,从而引发该错误。 总结来说,当出现“Could not autowire. No beans of 'xxxx' type found”这个错误时,应该先检查是否正确设置了`@Mapper`注解,然后再确认配置的扫描路径是否正确,同时也要确保相关的依赖已经被正确添加到项目。通过逐一排查这些问题,应该能够解决这个错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值