如果使用 @Autowired 进行注入,它只会按照类型查找,由于存在多个实现 FooService 接口的 Bean,所以会抛出 NoUniqueBeanDefinitionException 异常,提示找到了多个符合条件的 Bean,无法确定注入哪一个。为什么@resource按照类型查找不出错,但是这里的按照类型查找就会出错
时间: 2024-02-29 19:53:37 浏览: 18
虽然 `@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,则会抛出异常。