@resource在进行注入的时候如果有多个实现类,最后不还是要根据类型查找吗,这样的话为什么不会报错?
时间: 2024-02-29 07:53:39 浏览: 56
`@Resource` 在进行注入时,会先按照名称进行查找,如果找到了与指定名称相同的 Bean,则直接注入;如果没有找到,则会按照类型进行查找。
如果按照名称查找没有找到对应的 Bean,但是按照类型查找到了多个符合条件的 Bean,`@Resource` 会抛出一个异常,提示找到了多个符合条件的 Bean,无法确定注入哪一个。这个异常的类型是 `javax.annotation.Resource$AuthenticationException`,比较难以理解。
不过需要注意的是,如果按照名称查找到的 Bean 和按照类型查找到的 Bean 不是同一个 Bean,`@Resource` 也会抛出一个异常,提示找到了同类型但名称不同的多个 Bean,无法确定注入哪一个。这个异常的类型是 `javax.annotation.Resource$Exception`。
综上所述,使用 `@Resource` 进行注入时,如果指定了名称,则会优先按照名称进行查找,如果找到了对应的 Bean,则直接注入;如果没有找到,则会按照类型进行查找,如果找到了多个符合条件的 Bean,则会抛出异常。如果没有指定名称,则只会按照类型进行查找,如果找到了多个符合条件的 Bean,则会抛出异常。
相关问题
如果有多个实现 FooService 接口的 Bean,为什么使用@Resource注解不报错使用@Autoweired报错,请举例说明
@Resource 和 @Autowired 注解的主要区别在于它们的查找顺序不同。@Resource 会先按照名称查找,如果找不到再按照类型查找;而 @Autowired 只会按照类型查找。
举个例子,假设有如下代码:
```
public interface FooService {}
@Service("fooServiceImpl1")
public class FooServiceImpl1 implements FooService {}
@Service("fooServiceImpl2")
public class FooServiceImpl2 implements FooService {}
@Service
public class BarService {
@Resource
private FooService fooService;
@Autowired
private FooService fooService2;
}
```
在这个例子中,有两个实现 FooService 接口的 Bean,分别是 FooServiceImpl1 和 FooServiceImpl2,它们都被标记为@Service,并且分别使用了不同的名称。
在 BarService 中,有两个属性需要注入 FooService 实例,分别是 fooService 和 fooService2,分别使用了 @Resource 和 @Autowired 进行注入。
如果使用 @Resource 进行注入,它会先按照名称查找,即先查找名称为 "fooService" 的 Bean,由于没有找到,所以会按照类型查找,最终找到的是 FooServiceImpl1 实例,并注入到 fooService 属性中。
如果使用 @Autowired 进行注入,它只会按照类型查找,由于存在多个实现 FooService 接口的 Bean,所以会抛出 NoUniqueBeanDefinitionException 异常,提示找到了多个符合条件的 Bean,无法确定注入哪一个。
@resource的按照类型查找和@autoweired的按照类型查找有什么不一样?最后不都是按照类型查找吗
虽然 `@Resource` 和 `@Autowired` 都可以按照类型进行查找,但它们的具体实现方式不同,导致它们的用法和限制也有所不同。
具体来说,`@Resource` 先按照名称进行查找,如果找到了名称匹配的 Bean,则直接注入;如果没有找到,则按照类型进行查找。因此,如果在容器中有同类型的多个 Bean,使用 `@Resource` 注入时需要指定名称,否则会抛出 `NoUniqueBeanDefinitionException` 异常。
而 `@Autowired` 则直接按照类型进行查找,如果找到了多个类型匹配的 Bean,则会抛出 `NoUniqueBeanDefinitionException` 异常,需要手动指定需要注入的 Bean。此外,`@Autowired` 还支持根据名称进行查找,可以使用 `@Qualifier` 注解指定需要注入的 Bean 的名称。
因此,在实际使用中,`@Resource` 更适合按照名称进行注入,适用于单一 Bean 的情况;而 `@Autowired` 更适合按照类型进行注入,适用于多个类型相同但名称不同的 Bean 的情况。
阅读全文