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

2023-12-13 17:40:55

@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。

文章来源:https://blog.csdn.net/maple05/article/details/134974441
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。