Springboot的service循环依赖

项目中Service经常使用lombok提供的注解@RequiredArgsConstructor或者@AllArgsConstructor来注入其他Service

注解 @RequiredArgsConstructor生成带有必需参数的构造函数。 必需的参数是最终字段和具有约束的字段,例如@NonNull 。@AllArgsConstructor则是全部
但是使用的时候可能会存在循环依赖的问题

┌─────┐
|  sysUserV2ServiceImpl defined in URL [jar:file:/home/starwiz/data/hyt/starwiz.jar!/BOOT-INF/classes!/com/starwiz/project/system/v2/service/impl/SysUserV2ServiceImpl.class]
↑     ↓
|  processServiceImpl (field com.starwiz.project.workflow.WorkflowUtil com.starwiz.project.workflow.service.impl.ProcessServiceImpl.workflowUtil)
↑     ↓
|  workflowUtil (field com.starwiz.project.system.service.SysTodoService com.starwiz.project.workflow.WorkflowUtil.sysTodoService)
↑     ↓
|  sysTodoService (field private com.starwiz.project.warning.service.EarlyWarningFarmerService com.starwiz.project.system.service.impl.SysTodoServiceImpl.earlyWarningFarmerService)
↑     ↓
|  earlyWarningFarmerService (field com.starwiz.project.workflow.service.WorkflowService com.starwiz.project.warning.service.impl.EarlyWarningFarmerServiceImpl.workflowService)
↑     ↓
|  workflowServiceImpl (field com.starwiz.project.system.v2.service.SysUserV2Service com.starwiz.project.workflow.service.impl.WorkflowServiceImpl.sysUserV2Service)
└─────┘

  • 方法1
@Autowired
@Lazy //懒加载
  • 方法2
// lombok的注解 
@AllArgsConstructor
  • 方法3 使用 setter/field 方法注入
private DepartmentService departmentSerivce;
@Autowired
public void setDepartmentSerivce(DepartmentService departmentService) {
    this.departmentService = departmentService;
}
  • 方法4 使用 @PostConstruct
@Service
public class UserService {
    @Autowired
    private DepartmentService departmentService;
    @PostConstruct
    public void init() {
        departmentService.setUserService(this);
    }
    public DepartmentService getDepartmentService() {
        return departmentService;
    }
}
  • 方法5 实现ApplicationContextAware and InitializingBean接口
@Service
public class UserService implements ApplicationContextAware, InitializingBean {
 
    private DepartmentService departmentService;
 
    private ApplicationContext context;
 
    public DepartmentService getDepartmentService() {
        return departmentService;
    }
 
    @Override
    public void afterPropertiesSet() throws Exception {
        circB = context.getBean(DepartmentService.class);
    }
 
    @Override
    public void setApplicationContext(final ApplicationContext ctx) throws BeansException {
        context = ctx;
    }
}
  • 使用Mybatis Plus時,可以将依赖 Service 换成依赖 Mapper,因为 Mapper 中也有这些基础方法
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
循环依赖是指两个或多个类相互引用对方,导致在初始化bean时出现无法确定先后顺序的情况。在Spring Boot中,循环依赖是不鼓励的,默认情况下是禁止的。当出现循环依赖时,Spring Boot会抛出一个错误,并提供解决方法。 解决循环依赖的方式有两种: 1. 延迟加载:可以通过使用@Lazy注解来延迟加载其中一个bean,从而解决初始化顺序的问题。在需要互相依赖的bean上添加@Lazy注解,使其在真正被使用时才进行初始化。例如,可以在@Autowired注解上添加@Lazy注解: ``` @Autowired @Lazy private TokenService tokenService; ``` 2. 修改配置来打破循环:可以通过修改配置文件来允许循环依赖。在application.yml或application.properties文件中添加配置项spring.main.allow-circular-references: true即可允许循环依赖。请注意,这只是作为最后的手段,不推荐经常使用。 总之,循环依赖是一种不鼓励且默认禁止的情况,在Spring Boot中可以通过延迟加载或修改配置来解决循环依赖的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [springboot解决循环依赖问题](https://blog.csdn.net/qq_41175917/article/details/125912639)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

讓丄帝愛伱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值