`@Autowired` 和 `@Resource` 都是 Spring 框架中用于依赖注入的注解,它们有一些细微的区别:
1. 来源不同:
- `@Autowired` 是由 Spring 提供的注解。
- `@Resource` 是由 JSR-250 规范提供的注解,因此它不是 Spring 特有的。
2. 注入方式不同:
- `@Autowired` 默认按类型(byType)进行自动装配,如果需要按名称(byName)装配,则需要与 `@Qualifier` 注解一起使用。
- `@Resource` 默认按名称(byName)进行装配,如果找不到与名称匹配的 bean,则会按类型(byType)装配。此注解有一个 'name' 属性,可以显式指定要注入的 bean 的名称。
3. 必要性不同:
- `@Autowired` 默认情况下要求依赖对象必须存在,如果允许为 `null`,则需要设置 `required` 属性为 `false`。
- `@Resource` 默认情况允许依赖对象不存在,如果设置了 `name` 或 `type` 而对应的 bean 找不到,则注入失败。
4. 引入时间不同:
- `@Autowired` 是从 Spring 2.5 开始引入的。
- `@Resource` 是从 Spring 2.5 开始支持的,但它来源于 JSR-250 规范。
5. 执行时间点不同:
- `@Autowired` 是在所有的 Bean 完全初始化之后采取的处理方式。
- `@Resource` 是在 Bean 初始化中创建对象的时候就进行了注入。
在实际使用中,`@Autowired` 结合 `@Qualifier` 被更多地使用于 Spring 应用程序中,尤其是当按类型自动装配是首选的场景。而 `@Resource` 更适用于名称显式定义更为明确的场景,或者在想要遵循 JSR-250 规范的应用程序中。