@AutoWired和@Resource的区别
这两个我们在项目中,经常去使用。很少有人知道他们有什么区别。下面我们将从
- 来源
- 依赖查找顺序
- 支持的参数
- 依赖注入的用法支持
这四个方面来说明他们俩个的区别
来源
@Autowired
: 这是Spring框架自带的注解,用于实现自动依赖注入。@Resource
: 这是Java EE 5的注解,由JSR-250规范定义,也被Spring框架支持,用于实现JNDI查找和自动装配。
依赖查找顺序
@Autowired
: Spring容器在解析@Autowired
注解时,首先会按照类型进行匹配,如果存在多个相同类型的Bean,则会进一步根据名称进行匹配。如果没有明确指定名称,Spring将抛出异常。
指定名字用的注解就是@Qualifier
@Resource
: 默认的注入顺序是按照Bean的名称进行匹配,如果找不到,则会按照类型进行匹配。如果仍然找不到,将不会抛出异常,而是返回null
。
支持的参数
@Autowired
: 支持多种参数,包括required
(是否必须)和primary
(是否首选)等。@Resource
: 支持name
属性,可以通过它指定要注入的Bean的名称。也支持type
属性。可以根据类型查找对应的bean。
依赖注入的用法支持
@Autowired
: 支持属性注入、构造方法注入和Setter注入@Resource
: 只支持属性注入和Setter注入
额外补充
-
覆盖性:
@Autowired
提供了更丰富的配置选项,如通过@Qualifier
注解来指定注入的具体Bean。 -
兼容性:
@Autowired
是Spring特有的,而@Resource
是Java EE的一部分,因此@Resource
在非Spring环境中也可能被使用。 -
使用场景:
@Autowired
通常用于Spring管理的Bean之间的依赖关系,而@Resource
可能用于那些同时需要兼容Java EE环境的场景。 -
性能考虑: 在某些情况下,
@Autowired
可能需要更多的解析工作,特别是在没有明确指定Bean名称时,而@Resource
则直接依赖于JNDI查找,可能在查找顺序上更直接。 -
搜索范围
@Autowired
在Spring的组件扫描中搜索Bean。@Resource
在JVM范围内搜索资源,不限于Spring容器。
为什么idea推荐我们使用@Resource
当我们用@autowired的时候会有这样的提示
@Autowired
private IFileService fileService;
他给出的原因是这样的
下面给出一点我的见解。
- 使用
@Resource
可以提高代码的兼容性,特别是在需要与Java EE环境交互时。 @Autowired
如果找不到匹配的Bean,会抛出一个异常,除非它使用了optional=true
参数。@Resource
如果找不到匹配的资源,不会抛出异常,而是将变量设置为null
所以说我认为推荐使用@Resource
而不是@Autowired
的情况:
- 兼容性:如果你的应用程序需要在Java EE环境中运行,或者需要与Java EE资源进行交互,使用
@Resource
可以提高代码的兼容性。 - 默认行为:如果你更倾向于根据名称进行资源的自动装配,而不是类型,
@Resource
可能更符合你的需求。 - 避免异常:如果你希望在找不到匹配的资源时不抛出异常,而是将变量设置为
null
,@Resource
提供了这样的行为。
不管是使用@autowired还是@resource 都是可以实现功能的,更多的还是看我们的编程习惯。