Java 注解学习之路 -1 @Autowired和@Resource注解

本文深入探讨了Spring框架中@Autowired和@Resource注解的使用,它们用于实现依赖注入,简化了bean的配置过程,无需在配置文件中显式声明所有bean。

@Autowired和@Resource注释的作用为自动注入
在spring的框架下,主要用来加载配置项目的的bean
基础spring框架中对应的是配置文件中如下所示,并且需要在项目中建立起对一个的zoo的抽象类Zoo.class

 <bean id="Zoo"
class="com.beens.Zoo">
 		<property name="tiger" ref="tiger" />
        <property name="monkey" ref="monkey" />
</bean>

采用注解的方式会将对应been类自动加载过来,无需在配置文件中配置出所有的been

//@Resource,需要制定been的名称
@Resource(name = "Zoo")
private Zoo zoo;
//@Autowired,可以不指定名称,会自动通过下面的类名进行就加载
@Autowired
private Zoo zoo;
<think>我们被要求解释@Autowired@Resource注解的不同,这两个注解在Spring中用于依赖注入。 首先,我们需要明确这两个注解的来源、默认行为以及使用方式上的区别。 然后,我们可以通过代码示例来展示它们的使用方式区别。 最后,按照要求提出相关问题。 </think>### `@Autowired` `@Resource` 注解的区别详解 这两个注解Java Spring 框架中都用于依赖注入,但存在关键差异: | 特性 | `@Autowired` | `@Resource` | |-------------------|------------------------------------|------------------------------------| | **来源** | Spring 框架原生注解 | Java EE (JSR-250) 标准注解 | | **依赖查找方式** | 按类型优先 | 按名称优先 | | **包路径** | `org.springframework.beans.factory.annotation` | `javax.annotation` | | **是否支持空注入**| 支持 `@Autowired(required=false)` | 默认必须注入,无法设为可选 | | **限定符** | `@Qualifier` | `name` 属性 | | **构造器/方法注入**| 支持 | 不支持 | --- ### 代码示例对比 #### 1. 基本注入场景 ```java @Service public class PaymentService { // @Autowired 按类型注入 @Autowired private PaymentProcessor processorType; // @Resource 按名称注入 @Resource(name = "creditCardProcessor") private PaymentProcessor processorName; } @Component("creditCardProcessor") public class CreditCardProcessor implements PaymentProcessor {} @Component("paypalProcessor") public class PayPalProcessor implements PaymentProcessor {} ``` - **`@Autowired`** 会查找 `PaymentProcessor` 类型的实现类(如果有多个需配合 `@Qualifier`) - **`@Resource`** 直接查找名为 `"creditCardProcessor"` 的组件 --- #### 2. 处理多个实现类 ```java // 使用 @Autowired 需要配合 @Qualifier @Service public class OrderService { @Autowired @Qualifier("expressShipping") private ShippingService shippingService; } // 使用 @Resource 直接指定名称 @Service public class InventoryService { @Resource(name = "standardShipping") private ShippingService shippingService; } @Component("expressShipping") public class ExpressShipping implements ShippingService {} @Component("standardShipping") public class StandardShipping implements ShippingService {} ``` --- #### 3. 构造器注入(仅 @Autowired 支持) ```java @Service public class UserService { private final UserRepository userRepo; // @Autowired 支持构造器注入(Spring 4.3+ 可省略注解@Autowired public UserService(UserRepository userRepo) { this.userRepo = userRepo; } // @Resource 无法用于构造器 } ``` --- #### 4. 集合注入差异 ```java @Service public class NotificationService { // @Autowired 收集所有 AuditListener 实现 @Autowired private List<AuditListener> allListeners; // @Resource 按名称注入特定实现 @Resource(name = "databaseAudit") private AuditListener dbListener; } ``` --- ### 最佳实践指南 1. **推荐使用场景**: - 需要类型安全注入 → `@Autowired` - 需要精确指定组件名称 → `@Resource` - 需要构造器注入 → `@Autowired` 2. **避免的陷阱**: ```java // 错误示范:@Resource 尝试构造器注入 public class ErrorExample { private SomeService service; @Resource // 编译无错但注入会失败! public ErrorExample(SomeService service) { this.service = service; } } ``` 3. **混合使用技巧**: ```java @Service public class HybridService { // 结合两者优势:按类型 + 名称限定 @Autowired @Qualifier("specificBean") private SomeComponent component; } ``` 4. **测试用例演示**: ```java @SpringBootTest public class InjectionTest { @Autowired // 按类型注入 private PaymentService paymentService; @Resource(name = "creditCardProcessor") // 按名称注入 private PaymentProcessor processor; @Test void testInjection() { assertNotNull(paymentService.getProcessorType()); assertEquals("creditCard", processor.process()); } } ``` --- ### 核心区别总结 1. **来源不同**: - `@Autowired` 是 Spring 专有注解 - `@Resource` 是 Java 标准注解(更通用) 2. **注入策略**: - `@Autowired` 默认类型优先 → 可能因多个实现失败 - `@Resource` 默认名称优先 → 更精确但缺乏类型安全 3. **灵活性**: - `@Autowired` 支持构造器/方法注入可选依赖 - `@Resource` 仅支持字段/Setter 注入 4. **适用场景**: - Spring 项目优先用 `@Autowired` - 跨容器/非 Spring 项目用 `@Resource` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值