@Autowired 和 @Resource 的区别是什么?

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。 https://store.amazingmemo.com/chapterDetail/1685324709017001`

@Autowired@Resource 的区别

当我们在Spring框架中进行依赖注入时,我们通常会使用 @Autowired@Resource 这两个注解。虽然这两个注解都是用来实现依赖注入的,但它们之间还是存在一些差异。

@Autowired

@Autowired 是Spring框架提供的注解,它可以对类成员变量、方法以及构造函数进行标注,来完成自动装配的工作。通过 @Autowired 的使用,Spring 会在启动时进行自动扫描,并将标记了该注解的类的依赖关系自动注入。

特点:

  • 默认按照类型进行自动装配 (byType)。

  • 如果需要按名称进行装配,则需要和 @Qualifier 注解一起使用。

  • 当找不到合适的Bean装配时,会抛出异常,除非将 required 属性设置为 false

代码示例:

@Service
public class MyService {
    @Autowired
    private MyDependency myDependency;
}

@Resource

@Resource 是由JSR-250规范提供的注解。这个注解是属于JavaEE的,从JavaEE 5开始就拥有了 @Resource 注解,Spring 支持这个注解并且在其基础之上增加了额外的功能。

特点:

  • 默认按照名称进行自动装配 (byName)。

  • 如果没有指定名称,它会默认使用需要注入的变量的名称作为Bean的名称来查找。

  • 如果按名称注入失败,则会按照类型进行注入。

  • 不需要与其他注解配合使用。

  • 提供了 nametypeauthenticationType 等属性。

代码示例:

@Service
public class MyService {
    @Resource
    private MyDependency myDependency;
}

总结

  • @Autowired 是Spring的注解,主要是按类型 (byType) 自动装配,而 @Resource 是JavaEE的注解,主要是按名称 (byName) 自动装配。

  • @Autowired@Qualifier 配合使用可以按名称进行装配,而 @Resource 可以通过 name 属性直接指定Bean的名称。

  • 在注入时,@Autowired 通过设置 required 属性来避免异常,而 @Resource 有更多的配置属性如 nametype

在选择使用哪一个注解时,需要考虑你的具体需求和你使用的Spring版本,以选择最适合你项目的注解。

最后更新于