大家好,我是锋哥。今天分享关于【Spring AutoWired与Resource区别?】面试题。希望对大家有帮助;
Spring AutoWired与Resource区别?
1000道 互联网大厂Java工程师 精选面试题-Java资源分享网
在 Spring 中,@Autowired
和 @Resource
都是用于依赖注入(DI,Dependency Injection)的注解,它们的作用是将一个 Bean 自动注入到另一个 Bean 中。虽然它们的功能相似,但也存在一些差异。下面我们将详细对比这两者的不同之处。
1. @Autowired
注解
@Autowired
是 Spring 提供的注解,它可以自动将一个 Bean 注入到其他 Bean 中。它基于类型(默认)或名称来注入依赖,具体行为可以通过不同的配置来定制。
使用方式:
@Component
public class Car {private Engine engine;@Autowiredpublic Car(Engine engine) { // 构造器注入this.engine = engine;}public Engine getEngine() {return engine;}
}
主要特点:
-
按类型注入:
@Autowired
默认是按类型(type)来进行注入的。Spring 会根据类型自动匹配合适的 Bean。如果有多个符合条件的 Bean,会根据配置的规则选择一个。 -
构造器注入、字段注入和方法注入:
@Autowired
可以用在构造器、字段和 setter 方法上。 -
required
属性:可以通过@Autowired(required=false)
来配置非必需的依赖,如果没有找到匹配的 Bean,则不会抛出异常。示例:
@Autowired(required = false) // 不会抛出异常,如果没有找到对应的 Bean private Engine engine;
-
与
@Primary
配合使用:如果有多个候选 Bean 可以注入,@Primary
注解可以指定默认的注入 Bean。
按名称选择注入:
如果要按名称注入(比如某个 Bean 的名称为 engine
),可以配合 @Qualifier
注解使用。
@Autowired
@Qualifier("specificEngine")
private Engine engine;
2. @Resource
注解
@Resource
是 Javax 提供的注解,并且它是 JSR-250 的一部分。它的功能与 @Autowired
类似,但其注入方式优先考虑 按名称,其次按 类型 进行注入。
使用方式:
@Component
public class Car {@Resourceprivate Engine engine;
}
主要特点:
-
按名称注入:
@Resource
优先按照 Bean 的名称进行注入。如果没有找到符合名称的 Bean,Spring 会继续根据类型进行注入。 -
name
属性:可以显式指定要注入的 Bean 的名称。示例:
@Resource(name = "specificEngine") private Engine engine;
-
与
@Autowired
的区别:@Resource
注解具有明确的优先级,首先通过 Bean 的名称来匹配,如果没有找到匹配的 Bean,再按类型进行注入。因此,它在注入时会首先依赖名称来进行匹配,而不是像@Autowired
默认的按类型注入。例如:
@Component public class Car {@Resource(name = "specificEngine")private Engine engine; }
如果
@Resource
找不到名称为specificEngine
的 Bean,才会根据类型进行注入。
3. @Autowired
与 @Resource
的主要区别
特性 | @Autowired | @Resource |
---|---|---|
注入方式 | 默认按类型注入;可以通过 @Qualifier 按名称指定 | 默认按名称注入;如果找不到名称,则按类型注入 |
优先级 | 按类型优先匹配;可以使用 @Qualifier 精确匹配 | 按名称优先匹配;其次按类型匹配 |
required 属性 | 可以设置 required = false 控制是否为必填项 | 没有 required 属性 |
支持的注入位置 | 支持构造器注入、字段注入、setter 方法注入 | 仅支持字段注入和 setter 方法注入 |
规范支持 | Spring 提供的注解 | JSR-250 规范的一部分 |
4. 实际应用中选择使用 @Autowired
或 @Resource
@Autowired
更常用:由于@Autowired
是 Spring 框架提供的注解,默认按类型进行注入,因此在大多数情况下,它更加灵活且易于使用。使用时,通常搭配@Qualifier
精确指定注入的 Bean。@Resource
适合 Java EE 规范要求的场景:@Resource
是 JSR-250 规范的一部分,适用于那些需要遵循 Java EE 规范的项目,或者当你想明确按名称注入时,使用@Resource
会更加直观。
5. 代码示例比较
使用 @Autowired
按类型注入:
@Component
public class Car {@Autowiredprivate Engine engine; // 按类型注入 Engine 类型的 Bean
}
使用 @Resource
按名称注入:
@Component
public class Car {@Resource(name = "specificEngine")private Engine engine; // 按名称注入名为 specificEngine 的 Bean
}
总结
@Autowired
:是 Spring 专有的注解,按类型注入 Bean,具有灵活的配置选项,适用于大多数 Spring 应用。@Resource
:是 JSR-250 规范的一部分,优先按名称注入,如果没有找到合适的名称 Bean,则按类型注入,适合需要遵循 Java EE 规范的项目。
在实际开发中,@Autowired
是最常见的选择,@Resource
更多用于与 Java EE 标准兼容的项目。