@Autowired、@Resource区别详解及特殊应用场景

@Autowired 注解

@Autowired 是Spring提供的基于类型(by type)的自动装配注解。它会根据类型进行匹配,将对应类型的实例注入到目标字段、方法或构造函数中。

@Autowired 特殊应用场景

当一个接口同时有三个实现类时,在同一个方法当中需要同时用到这三个实现类

使用@Qualifier解决问题

接口

public interface MyService {
    void performAction();
}

第一个实现类

@Service
public class ServiceImplA implements MyService {
    @Override
    public void performAction() {
        System.out.println("Service A");
    }
}

第二个实现类

@Service
public class ServiceImplB implements MyService {
    @Override
    public void performAction() {
        System.out.println("Service B");
    }
}

第三个实现类

@Service
public class ServiceImplC implements MyService {
    @Override
    public void performAction() {
        System.out.println("Service C");
    }
}

实现类调用

@Component
public class MyComponent {

    @Qualifier("ServiceImplA")
    @Autowired
    private MyService ServiceImplA;

    @Qualifier("ServiceImplB")
    @Autowired
    private MyService ServiceImplB;

    @Qualifier("ServiceImplC")
    @Autowired
    private MyService ServiceImplC;

    public void doSomething() {
        ServiceImplA.performAction();
        ServiceImplB.performAction();
        ServiceImplC.performAction();
    }
}

@Resource 注解

@Resource 是Java EE 提供的注解,也可以用于依赖注入。

与 @Autowired 不同,@Resource 可以通过指定 name 或 type 属性来进行注入。

如果指定了 name,它将按照名称进行匹配(对应着bean的id);如果没有指定 name,则按照类型进行匹配。

简单举例

public interface MyService {
    void performAction();
}

@Service("serviceA")
public class ServiceImplA implements MyService {
    @Override
    public void performAction() {
        System.out.println("Service A");
    }
}

@Service("serviceB")
public class ServiceImplB implements MyService {
    @Override
    public void performAction() {
        System.out.println("Service B");
    }
}

@Service("serviceC")
public class ServiceImplC implements MyService {
    @Override
    public void performAction() {
        System.out.println("Service C");
    }
}

@Component
public class MyComponent {
    private final MyService myService;

    @Resource(name = "serviceB")
    public MyComponent(MyService myService) {
        this.myService = myService;
    }

    public void doSomething() {
        myService.performAction();
    }
}

在这个例子中,MyComponent 通过构造函数注入 MyService。通过 @Resource(name = "serviceB"),指定了要注入的实现类的名称为 "serviceB"。

总结

@Autowired 是Spring提供的注解,基于类型进行匹配,可以搭配 @Qualifier 使用,适用于Spring环境。

@Resource 是Java EE 提供的注解,可以按照名称或类型进行匹配,不仅限于Spring环境,也可以在其他Java EE 容器中使用。

一般而言,如果项目使用的是Spring框架,优先选择使用 @Autowired,因为它是Spring的一部分。如果需要更广泛的可移植性,可以考虑使用 @Resource。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值