@Service 互相调用全攻略:@Autowired vs @Resource在日常写 Spring Boot 项目的时候,经常会遇到一个问题:多个 @Service 之间需要互相调用,到底该怎么写才优雅?用 @Autowired?用 @Resource?循环依赖怎么办?
本文就带你一口气整清楚,并配合 Demo 来对比,最后还会总结最佳实践。

@Service 是什么?在 Spring 里,@Service 其实就是一个 特殊的 Bean。它被 Spring 容器管理,创建、销毁、注入都由 Spring 来完成。
所以,不管你用 @Autowired 还是 @Resource,本质上都是 依赖注入(Dependency Injection)。
@Autowired:Spring 派来的助手@Qualifier 指定;required = false,让依赖变成可选。@Service
public class UserService {
public String getUserName(Long id) {
return "User-" + id;
}
}
@Service
public class OrderService {
private final UserService userService;
// 构造器注入(推荐 ✅)
@Autowired
public OrderService(UserService userService) {
this.userService = userService;
}
public void createOrder(Long userId) {
System.out.println("订单用户: " + userService.getUserName(userId));
}
}@Resource:JDK 官方背书required = false。@Service
public class UserService {
public String getUserName(Long id) {
return "User-" + id;
}
}
@Service
public class OrderService {
@Resource
private UserService userService; // 按字段名 userService 找 Bean
public void createOrder(Long userId) {
System.out.println("订单用户: " + userService.getUserName(userId));
}
}@Service("vipUserService")
public class VipUserService extends UserService {
@Override
public String getUserName(Long id) {
return "VIP-" + id;
}
}
@Service
public class OrderService {
@Resource(name = "vipUserService")
private UserService userService;
public void createOrder(Long userId) {
System.out.println("订单用户: " + userService.getUserName(userId));
}
}有时候,你写着写着,就会掉进一个坑:两个 Service 互相依赖。
@Service
public class AService {
@Autowired
private BService bService;
public void a() {
System.out.println("A 调用");
bService.b();
}
}
@Service
public class BService {
@Autowired
private AService aService;
public void b() {
System.out.println("B 调用");
aService.a();
}
}结果:启动失败,提示循环依赖。

CService,避免直接互调。@Lazy。@Service
public class BService {
private final AService aService;
public BService(@Lazy AService aService) {
this.aService = aService;
}
public void b() {
System.out.println("B 调用");
aService.a();
}
}@Autowired 或 @Resource 都行,推荐 构造器 + @Autowired。
@Resource(name="xxx") 更直观;
@Autowired + @Qualifier("xxx") 也可以。
@Lazy。
@Autowired vs @Resource 没有绝对优劣
@Autowired;@Resource。在
@Autowired和@Resource之间纠结,远不如搞清楚你的代码结构更重要。 真正能写好 Service 之间调用的,不是靠注解,而是靠 架构设计。
App Store 截图生成器、应用图标生成器 、在线图片压缩和 Chrome插件-强制开启复制-护眼模式-网页乱码设置编码 乖猫记账,AI智能分类的最佳聊天记账App。 Elasticsearch可视化客户端工具