如果有多个实现 FooService 接口的 Bean,为什么使用@Resource注解不报错使用@Autoweired报错,请举例说明
时间: 2024-02-29 07:53:26 浏览: 27
@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,无法确定注入哪一个。