@Resource和@Autowired注解的不同,为什么推荐@Resource?

本文详细介绍了Spring框架中@Autowired和@Resource注解的差异。在接口有多个实现时,@Autowired配合@Qualifier用于指定具体实现,而@Resource默认按名称装配,可通过name属性指定。当存在多个实现时,可以使用@Primary标记主要实现,或者通过@Resource的name属性精确匹配。同时,示例代码展示了如何在测试类中注入并调用Service层的方法。

2者都可以用来装配bean,在接口仅有单一实现类时,两个注解的修饰效果相同,可以互相替换,不影响使用。
1.
@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用

@Resource(这个注解属于J2EE的),默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

当一个接口有2个实现的情况:
举例:

一个接口:

public interface UserDao {
    public void insert();
}

实现1:

@Repository("userJdbcDao")
public class UserJdbcDao implements UserDao{
    @Override
    public void insert() {
        System.out.println("我是-jdbc-Dao-实现插入操作");
    }
}

实现2:

@Repository("userJndiDao")
public class UserJndiDao implements UserDao{
    @Override
    public void insert() {
        System.out.println("我是-jndi-Dao-实现插入操作");
    }
}

service类:

@Service("userService")
public class UserService {

    @Autowired
    @Qualifier("userJdbcDao")
    private UserDao userDao=null;
    
    public void createUser(){
        userDao.insert();
    }
}

1.此时ide 会检测出你注入的Dao不是唯一,可以采用@Qualifier注解配合使用,指定你要注入哪个dao
2.也可以在实现接口的类上使用:
@Primary 出现冲突时候优先使用哪个实现类

推荐使用:@Resource:

实现类:@Repository(“userJdbcDao”)和service的@Resource(name=“userJdbcDao”) 一定要保持一致
UserJdbcDao 实现类名不一样也不影响

@Repository("userJdbcDao") //生命beanId
public class UserJdbcDao implements UserDao{
    @Override
    public void insert() {
        System.out.println("我是-jdbc-Dao-实现插入操作");
    }
}
@Service("userService")
public class UserService {
    @Resource(name="userJdbcDao")
    private UserDao userDao=null;

    public void createUser(){
        userDao.insert();
    }
}
@SpringBootTest
class TestApplicationTests {

    @Resource(name="userService")
    private UserService userService;

    @Test
    public void testcreateUser(){
        userService.createUser();
    }
}

代码:
测试代码源码地址

文章来自于It老齐001

<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` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我先来一碗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值