@Autowired 是Spring提供的基于类型(by type)的自动装配注解。它会根据类型进行匹配,将对应类型的实例注入到目标字段、方法或构造函数中。
当一个接口同时有三个实现类时,在同一个方法当中需要同时用到这三个实现类
使用@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 是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。