如果使用 @Autowired 进行注入,它只会按照类型查找,由于存在多个实现 FooService 接口的 Bean,所以会抛出 NoUniqueBeanDefinitionException 异常,提示找到了多个符合条件的 Bean,无法确定注入哪一个。那为什么这里面的按照类型查找就会报错?
时间: 2024-02-29 19:53:29 浏览: 13
在使用 `@Autowired` 进行注入时,它会直接按照类型进行查找,如果找到了多个符合条件的 Bean,则会抛出 `NoUniqueBeanDefinitionException` 异常,提示找到了多个符合条件的 Bean,无法确定注入哪一个。
与 `@Resource` 不同的是,`@Autowired` 不会先按照名称进行查找,只会按照类型进行查找。因此,在容器中有多个实现 `FooService` 接口的 Bean 时,如果使用 `@Autowired` 进行注入,会抛出 `NoUniqueBeanDefinitionException` 异常。
需要解决这个问题,可以使用 `@Qualifier` 注解指定需要注入的 Bean 的名称,或者使用 `@Primary` 注解标注默认的注入 Bean。例如:
```java
@Service
public class MyService {
@Autowired
@Qualifier("fooServiceImpl1")
private FooService fooService;
//...
}
```
在这个例子中,我们使用 `@Qualifier` 注解指定需要注入名称为 "fooServiceImpl1" 的 Bean,这样就可以避免 `NoUniqueBeanDefinitionException` 异常的发生。
相关问题
如果有多个实现 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,无法确定注入哪一个。
使用@Autowired注解时,如果有多个同类型的bean存在,需要使用@Qualifier注解来指定具体要注入的bean,Resource注解不用吗
使用@Autowired注解时,如果有多个同类型的bean存在,确实需要使用@Qualifier注解来指定具体要注入的bean,而@Resource注解则不需要。
这是因为在Spring中,@Autowired注解是按照类型(Type)来自动装配bean的,默认情况下它会选择与属性类型匹配的bean进行注入。但是,如果有多个类型相同的bean存在,就会产生歧义,这时就需要使用@Qualifier注解来指定具体要注入的bean。
而@Resource注解则是按照名称(Name)来自动装配bean的,默认情况下它会选择与属性名称匹配的bean进行注入。如果有多个名称相同的bean存在,可以通过指定name属性或者type属性来指定具体要注入的bean。
因此,如果你想使用@Resource注解来注入bean,可以在属性上直接使用@Resource注解,而不需要额外使用@Qualifier注解。不过,需要注意的是,@Resource注解的name属性和type属性都是可选的,如果不指定,它会默认按照属性名称或者属性类型来进行自动装配。