0%

java | @Resource

这个要和 @Autowired 一起看。

@ResourceJDK原生的注解。

@Resource有两个属性nametype

Spring@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。

所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。

如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。

@Autowired只根据type进行注入,不会去匹配name。如果涉及到type无法辨别注入对象时,那需要依赖@Qualifier@Primary注解一起来修饰。

定义接口做饭Cook.java

1
2
3
public interface Cook {
String cooking();
}

定义实现类炒西红柿CookTomato.java

1
2
3
4
5
6
7
@Service
public class CookTomato implements Cook {
@override
public String cooking() {
return "炒西红柿中~";
}
}

定义Controller类CookController.java,注入Cook接口

1
2
3
4
5
6
7
8
9
10
11
12
@RestController
@RequestMapping("/cook")
public class CookController {

@Resource
private Cook cook;

@RequestMapping("/cooking")
public String cooking() {
return cook.cooking();
}
}

启动Spring Boot运行起来后请求三个接口都是正常的返回结果。

但是如果我们增加Cook接口的实现类

1
2
3
4
5
6
7
@Service
public class CookPatato implements Cook {
@override
public String cooking() {
return "炒土豆丝中~";
}
}

这个时候启动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
2
@Resource(name="cookTomato")
private Cook cook;

或者

1
2
3
@Resource
@Qualifier("cookTomato")
private Cook cook;

就可以了。

集合注入

@Autowired 一样,其特可以通过集合进行注入,可以直接看 @Autowired 用法。

请我喝杯咖啡吧~