@Resource
和 @Autowired
都是用于依赖注入(Dependency Injection, DI)的注解,它们的主要作用是实现控制反转(Inversion of Control, IoC),即由容器来负责对象的创建和依赖关系的管理。以下是它们的作用和区别:
作用:
-
依赖注入:它们都用于将外部资源(如数据库连接、服务等)注入到Spring管理的Bean中,实现解耦合和模块化。
-
自动装配:它们都支持自动装配功能,即容器在创建Bean时自动将依赖注入到Bean的属性中。
区别:
-
来源和规范:
@Autowired
:Spring框架提供的注解,遵循Spring的自动装配规则。@Resource
:JSR-250规范提供的注解,由Java EE提供支持,Spring对其进行了增强。
-
自动装配的默认行为:
@Autowired
:默认按类型(byType)自动装配,如果存在多个相同类型的Bean,则可以通过@Qualifier
注解指定注入哪一个。@Resource
:默认按名称(byName)自动装配,可以通过name
属性指定要注入的Bean的名称。如果未指定name
属性,则会尝试通过字段名或setter方法名进行匹配。
-
注入位置:
@Autowired
:可以用于构造器、字段、设置方法。@Resource
:可以用于字段和设置方法,但JSR-250规范中不推荐用于构造器。
-
兼容性和环境要求:
@Autowired
:是Spring特有的,使用时需要导入Spring的依赖。@Resource
:遵循JSR-250规范,不需要导入Spring的依赖,但需要J2EE的容器支持。
-
优先级:
- 在Spring中,如果一个字段同时标记了
@Autowired
和@Resource
,@Autowired
将被优先考虑。
- 在Spring中,如果一个字段同时标记了
-
异常处理:
@Autowired
:可以通过required
属性设置是否必须注入,required=false
时未找到Bean不会抛出异常。@Resource
:默认required=true
,未找到匹配的Bean会抛出异常。
-
查找策略:
@Autowired
:可以通过@Qualifier
注解指定注入特定的Bean。@Resource
:可以通过lookup
属性指定是否需要查找Bean。
总结来说,@Autowired
是Spring框架特有的注解,而 @Resource
是JSR-250规范的一部分,两者在自动装配的默认行为和使用方式上有所不同。在实际开发中,可以根据项目需求和团队习惯来选择使用哪一个注解。