@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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!