为什么@Resource无法注入泛型类型而@Autowired可以

发布时间 2023-09-24 21:22:28作者: 清寡

在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比较便捷。