@Resource
和@Autowired
都是Spring框架中用于依赖注入的注解,但它们之间存在一些关键区别:
@Autowired
- 来源:
@Autowired
是Spring框架的一部分。 - 默认行为:
@Autowired
默认按照类型进行自动装配。如果找到多个相同类型的bean,则会根据@Qualifier
注解或byType
参数进行选择。如果没有找到匹配的bean,将抛出异常,除非设置了required
属性为false
。 - 灵活性:
@Autowired
提供了更多的配置选项,例如可以指定是否必需(required
属性)或者进行自定义的注入逻辑(使用@Autowired
的value
属性)。 - 注解位置:
@Autowired
可以用于构造器、字段、setter方法和其他任何方法上。
@Resource
- 来源:
@Resource
是由JSR-250规范定义的,不是Spring特有的,因此它可以在任何实现了JSR-250的容器中工作,如Java EE 5及其后续版本。 - 默认行为:
@Resource
默认按照名称进行装配。如果找不到与名称匹配的bean,则会回退到按照类型进行装配。如果仍然找不到,将会抛出异常。 - 灵活性:
@Resource
的配置选项较少,它主要依赖于名称匹配,但可以通过name
属性指定要注入的bean的名称。 - 注解位置:
@Resource
可以用于字段和setter方法上,但不能用于构造器。
区别总结
- 注入方式:
@Autowired
默认按类型注入,@Resource
默认按名称注入。 - 来源和兼容性:
@Autowired
是Spring特有的,而@Resource
是JSR-250规范的一部分,可以在任何支持JSR-250的容器中使用。 - 配置选项:
@Autowired
提供了更多的配置选项,@Resource
相对简单。 - 注解位置:
@Autowired
的使用范围更广,可以用于构造器、字段、setter方法和其他方法,而@Resource
通常用于字段和setter方法。