这个要和 @Autowired
一起看。
@Resource
是JDK
原生的注解。
@Resource
有两个属性name
和type
。
Spring
将@Resource
注解的name
属性解析为bean
的名字,而type
属性则解析为bean
的类型。
所以如果使用name
属性,则使用byName
的自动注入策略,而使用type
属性时则使用byType
自动注入策略。
如果既不指定name
也不指定type
属性,这时将通过反射机制使用byName
自动注入策略。
@Autowired
只根据type
进行注入,不会去匹配name
。如果涉及到type
无法辨别注入对象时,那需要依赖@Qualifier
或@Primary
注解一起来修饰。
定义接口做饭Cook.java
1 | public interface Cook { |
定义实现类炒西红柿CookTomato.java
1 |
|
定义Controller类CookController.java,注入Cook接口
1 | @RestController |
启动Spring Boot
运行起来后请求三个接口都是正常的返回结果。
但是如果我们增加Cook
接口的实现类
1 |
|
这个时候启动Spring Boot
,控制台会报错
1 | 2021-10-24 10:24:10.662 WARN 5592 --- [ restartedMain] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'CookController': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.janeroad.annotation.service.Cook' available: expected single matching bean but found 2: CookTomato,CookPatato |
大致意思是我们引入Cook
但是Spring
框架发现了有两个实现,无法匹配到bean
我们将代码改成这样
1 |
|
或者
1 | @Resource |
就可以了。
集合注入
和 @Autowired
一样,其特可以通过集合进行注入,可以直接看 @Autowired
用法。