在Spring框架中,我们通常使用@Autowired和@Resource两个注解来实现属性注入。但是当涉及到泛型类型时,使用@Resource注解就会失败,而@Autowired可以正常工作。这篇文章就来分析它们之间的区别。
@Autowired可以直接注入泛型类型,例如:
``` java
@Autowired
private Repository<User> userRepository;
```
但如果使用@Resource,则会报错:
``` java
@Resource
private Repository<User> userRepository; //报错
```
这是因为@Autowired按照类型(byType)进行注入,可以直接注入Repository<User>这种具体的泛型类型。而@Resource默认按名称(byName)注入,需要指定一个名称给容器中的bean。但是泛型类型信息在运行时会被擦除,导致无法使用泛型类型作为名称进行注入。
@Resource可以通过name属性指定一个bean名称来注入:
``` java
@Resource(name="userRepository")
private Repository<User> userRepository;
```
但这种方式需要在容器中明确定义一个名为“userRepository”的bean,不如@Autowired方便。
所以结论就是:@Autowired可以按类型直接注入泛型类型,而@Resource需要指定名称,无法使用泛型类型名作为名称,所以无法直接注入泛型类型。
这与两者的注入机制有关,@Autowired按类型,更灵活;@Resource默认按名称,在泛型场景下需要人工定制名称,不太方便。所以在实现泛型依赖注入时,通常建议使用@Autowired比较便捷。
标签:userRepository,Resource,Autowired,类型,泛型,注入 From: https://www.cnblogs.com/huanledo/p/17726699.html