@resource的按照类型查找和@autoweired的按照类型查找有什么不一样?最后不都是按照类型查找吗
时间: 2024-02-29 20:53:39 浏览: 22
虽然 `@Resource` 和 `@Autowired` 都可以按照类型进行查找,但它们的具体实现方式不同,导致它们的用法和限制也有所不同。
具体来说,`@Resource` 先按照名称进行查找,如果找到了名称匹配的 Bean,则直接注入;如果没有找到,则按照类型进行查找。因此,如果在容器中有同类型的多个 Bean,使用 `@Resource` 注入时需要指定名称,否则会抛出 `NoUniqueBeanDefinitionException` 异常。
而 `@Autowired` 则直接按照类型进行查找,如果找到了多个类型匹配的 Bean,则会抛出 `NoUniqueBeanDefinitionException` 异常,需要手动指定需要注入的 Bean。此外,`@Autowired` 还支持根据名称进行查找,可以使用 `@Qualifier` 注解指定需要注入的 Bean 的名称。
因此,在实际使用中,`@Resource` 更适合按照名称进行注入,适用于单一 Bean 的情况;而 `@Autowired` 更适合按照类型进行注入,适用于多个类型相同但名称不同的 Bean 的情况。
相关问题
@resource在进行注入的时候如果有多个实现类,最后不还是要根据类型查找吗,这样的话为什么不会报错?
`@Resource` 在进行注入时,会先按照名称进行查找,如果找到了与指定名称相同的 Bean,则直接注入;如果没有找到,则会按照类型进行查找。
如果按照名称查找没有找到对应的 Bean,但是按照类型查找到了多个符合条件的 Bean,`@Resource` 会抛出一个异常,提示找到了多个符合条件的 Bean,无法确定注入哪一个。这个异常的类型是 `javax.annotation.Resource$AuthenticationException`,比较难以理解。
不过需要注意的是,如果按照名称查找到的 Bean 和按照类型查找到的 Bean 不是同一个 Bean,`@Resource` 也会抛出一个异常,提示找到了同类型但名称不同的多个 Bean,无法确定注入哪一个。这个异常的类型是 `javax.annotation.Resource$Exception`。
综上所述,使用 `@Resource` 进行注入时,如果指定了名称,则会优先按照名称进行查找,如果找到了对应的 Bean,则直接注入;如果没有找到,则会按照类型进行查找,如果找到了多个符合条件的 Bean,则会抛出异常。如果没有指定名称,则只会按照类型进行查找,如果找到了多个符合条件的 Bean,则会抛出异常。
如果使用 @Autowired 进行注入,它只会按照类型查找,由于存在多个实现 FooService 接口的 Bean,所以会抛出 NoUniqueBeanDefinitionException 异常,提示找到了多个符合条件的 Bean,无法确定注入哪一个。为什么@resource按照类型查找不出错,但是这里的按照类型查找就会出错
虽然 `@Resource` 和 `@Autowired` 都可以按照类型进行查找,但是它们的具体实现方式不同,导致它们的用法和限制也有所不同。
具体来说,`@Resource` 先按照名称进行查找,如果找到了名称匹配的 Bean,则直接注入;如果没有找到,则按照类型进行查找。因此,如果在容器中有同类型的多个 Bean,使用 `@Resource` 注入时需要指定名称,否则会抛出 `NoUniqueBeanDefinitionException` 异常。
而 `@Autowired` 则直接按照类型进行查找,如果找到了多个类型匹配的 Bean,则会抛出 `NoUniqueBeanDefinitionException` 异常,需要手动指定需要注入的 Bean。此外,`@Autowired` 还支持根据名称进行查找,可以使用 `@Qualifier` 注解指定需要注入的 Bean 的名称。
因此,在实际使用中,如果存在多个符合条件的 Bean,使用 `@Autowired` 进行注入时会抛出 `NoUniqueBeanDefinitionException` 异常,需要手动指定需要注入的 Bean。而使用 `@Resource` 进行注入时,则会按照名称进行查找,如果没有找到对应名称的 Bean,则会按照类型进行查找,如果找到了多个符合条件的 Bean,则会抛出异常。
所以,可能是因为 `@Resource` 先按照名称查找,如果没有找到对应名称的 Bean,则会按照类型进行查找,并且默认只注入找到的第一个 Bean,所以不会报错。而 `@Autowired` 直接按照类型查找,如果找到多个 Bean,则会抛出异常。