一、背景:
IDEA中使用@Autowired
报错Could not autowire. No beans of 'XXX' type found
,错误大致意思为:没有匹配到类型为XXX的bean。
二、原因:
个人觉得,注入controller
的service
虽然一般来说我们都是注入一个接口,但是该接口有实现类,并且使用@Service
进行关联,所以注入类型应该也可以视为一个类,但是mybatis
仅需提供Dao
接口,也就是说,注入service
的dao
只是一个接口,而没有实现类,虽然mybatis
能够通过Dao接口和xml文件实现与数据库的操作,但是@Autowired
并没有这个识别功能,可能它就认为你类型不匹配,无法使用通过类型注入的方法。
三、解决方法:
- 在相应
mapper
中加上@***ponent
注解 - 检查
service
层有没有加入@service
注解,若无则加上 - 使用
@resource
注解代替@Autowired
注解 -
@Autowired(required = false)
设置required
属性值为false
,错误提示消失。 - 在相应的
dao
层加入@Repository
注解
四、@Autowired和@Resource的区别:
-
@Resource
和@Autowired
注解都是用来实现依赖注入的。只是@AutoWried
按by type
自动注入,而@Resource
默认按byName
自动注入。 -
@AutoWried
基于spring
的注解org.springframework.beans.factory.annotation.Autowired
,它默认是按类型进行的装配的。任何给定bean
类只有一个构造函数(最大值)可以声明这个注释,并将'required'
参数设置为true,表示构造函数在用作Spring bean
时要自动装配。如果多个非必需构造函数声明了注释,则它们将被视为自动装配的候选者。将选择具有最大数量的依赖项的构造函数,这些构造函数可以通过匹配Spring
容器中的bean
来满足。如果不能满足任何候选者,则将使用主要/默认构造函数(如果存在)。如果一个类只声明一个构造函数开头,它将始终被使用,即使没有注释。带注释的构造函数不必是公共的。 - @
Resource
是基于j2ee
的注解(可以减少了与spring
的耦合)(JDK1.6
以上支持)默认是按名字进行注解。注释标记应用程序所需的资源。此注释可以应用于应用程序组件类,或者该组件类的字段或方法。如果将该注释应用于一个字段或方法,那么初始化应用程序组件时容器将把所请求资源的一个实例注入其中。如果将该注释应用于组件类,则该注释将声明一个应用程序在运行时将查找的资源。即使此注释没有被标记为Inherited
,部署工具仍然需要检查任意组件类的所有超类,以发现这些超类中所有使用此注释的地方。所有此类注释实例都指定了应用程序组件所需的资源。注意,此注释可能出现在超类的private
字段和方法上;在这种情况下容器也需要执行注入操作。
五、总结
- 本文简单讲述了
@Autowired
报错Could not autowire. No beans of 'XXX' type found
的原因以及解决办法 - 欢迎大家提出建议以及批评,有任何问题可以私信