如果有遗漏,评论区告诉我进行补充
面试官: Autowired和Resource关键字的区别?
我回答:
在Java高级面试中,@Autowired
和@Resource
是两个经常被提到的注解,它们主要用于Spring框架中的依赖注入。下面是对这两个注解的详细解释和它们之间的区别:
一、@Autowired注解
- 来源 :
@Autowired
是Spring框架提供的注解,用于实现自动装配。 - 注入方式 :
@Autowired
可以用在字段、构造方法、Setter方法上,用于实现自动装配。Spring会根据类型(by type)进行自动匹配。 - 匹配规则 :
- 当有多个类型匹配时,Spring会根据类型选择合适的bean进行注入。
- 如果存在多个相同类型的bean,可以使用
@Qualifier
注解指定要注入的bean的名称。
- 依赖查找顺序 :
@Autowired
首先根据类型进行查找,如果存在多个相同类型的bean,则再根据名称进行查找。 - 参数 :
@Autowired
只支持一个required
参数,表示是否开启自动注入,默认是true
,要求依赖对象必须存在。如果允许null值,可以设置为false
。
二、@Resource注解
- 来源 :
@Resource
是Java EE的规范,是JSR-250规范定义的注解,也是Java标准的一部分。它同样可以在Spring应用中使用,但不同于@Autowired
,它并不是Spring的特有注解。 - 注入方式 :
@Resource
可以用在字段、Setter方法上,也可以用在配置文件的bean定义上(虽然不常见)。它默认按照名称(by name)进行自动装配,但也支持按照类型进行匹配。 - 匹配规则 :
- 如果指定了
name
属性,则按照指定的名称进行匹配。 - 如果没有指定
name
属性,则默认按照字段名或方法名进行匹配。 - 如果找不到与名称匹配的bean,则按照类型进行匹配。
- 如果指定了
- 依赖查找顺序 :
@Resource
首先根据名称进行查找,如果找不到匹配的bean,则再按照类型进行查找。 - 参数 :
@Resource
支持多个参数,其中最重要的两个参数是name
和type
。通过这两个参数,可以精确地指定要注入的bean。
三、@Autowired和@Resource的区别
- 来源不同 :
@Autowired
是Spring框架提供的注解,而@Resource
是Java EE的规范。 - 注入方式不同 :
@Autowired
主要用在字段、构造器和Setter方法上,而@Resource
可以用在字段、Setter方法上,还可以用在配置文件的bean定义上(虽然不常见)。 - 匹配规则和查找顺序不同 :
@Autowired
默认按照类型进行匹配,如果存在多个相同类型的bean,则再根据名称进行查找;而@Resource
默认按照名称进行匹配,如果找不到匹配的bean,则再按照类型进行查找。 - 参数不同 :
@Autowired
只支持一个required
参数,而@Resource
支持多个参数,包括name
和type
等。 - 兼容性 :在Spring应用中,
@Autowired
和@Resource
都可以用于依赖注入,但@Autowired
是Spring特有的注解,与Spring框架的集成度更高;而@Resource
作为Java EE的规范,在跨平台、跨框架的应用中可能更具兼容性。
特性 | @Autowired | @Resource |
---|---|---|
注解来源 | Spring 框架 | Java EE (Jakarta EE) 标准 |
默认注入方式 | 按类型 (byType ) |
按名称 (byName ),若找不到则按类型 |
支持的作用位置 | 构造函数、字段、setter 方法 | 字段、setter 方法 |
是否推荐构造器注入 | 是,特别是对于必须依赖 | 否 |
自动装配策略 | 支持多种模式,默认为 byType |
默认为 byName |
可选性配置 | required=false |
name="" 或 lookup-method |
四、使用建议
- 当一个接口类只有一个实现类时,
@Autowired
和@Resource
都可以使用,但@Resource
不会触发IDE的警告或错误提示。 - 当一个接口类有多个实现类时,应谨慎使用
@Autowired
,因为它可能会导致不明确的依赖注入。此时,可以结合@Qualifier
注解来指定要注入的bean的名称,或者使用@Resource
并通过name
属性来精确指定要注入的bean。