当前位置: 首页 > news >正文

网站建设座谈会上的发言企业网站设计推荐

网站建设座谈会上的发言,企业网站设计推荐,广西玉林建设厅官方网站,微信卖货小程序Spring Boot解决循环依赖注入问题 代码问题回显启动错误日志解决方案:使用事件驱动或通过 ApplicationContext 手动获取 Bean1. 事件驱动设计2. 使用 ApplicationContext 手动获取 Bean3. 拆分逻辑 总结 代码问题回显 现有代码1 在InterestService中依赖MemberInte…

Spring Boot解决循环依赖注入问题

  • 代码问题回显
  • 启动错误日志
  • 解决方案:使用事件驱动或通过 ApplicationContext 手动获取 Bean
    • 1. 事件驱动设计
    • 2. 使用 `ApplicationContext` 手动获取 Bean
    • 3. 拆分逻辑
  • 总结

代码问题回显

现有代码1 在InterestService中依赖MemberInterestService

@Service
@AllArgsConstructor
public class InterestService {// 注意此处循环依赖注入private final MemberInterestService memberInterestService;private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);/*** 调度下一个利息任务*/public void scheduleNextInterestTask() {// 省略其他代码...}
}

现有代码2 在MemberInterestService实现类中注入InterestService

@Service
@AllArgsConstructor
public class MemberInterestServiceImpl extends ServiceImpl<MemberInterestMapper, MemberInterest> implements MemberInterestService {// 注意此处循环依赖注入private final InterestService interestService;@Overridepublic Boolean updateExpireStatus(MemberInterestExpireStatus body) {// 省略其他代码...if (updateById(interest)){// TODO 此处出现循环依赖注入(直接报错)interestService.scheduleNextInterestTask();return true;}}
}

启动错误日志

Description:
The dependencies of some of the beans in the application context form a cycle:   
mobileLoginController (field private com.sinbyte.framework.web.service.SysLoginService 
com.sinbyte.web.controller.system.MobileLoginController.loginService)      
↓   
sysLoginService (field private com.sinbyte.ray.service.MemberUserService 
com.sinbyte.framework.web.service.SysLoginService.memberUserService)
┌─────┐
|  memberInterestServiceImpl defined in file [D:\Java\IdeaProjects\alliance-server\alliance-ray\target\classes\com\sinbyte\ray\service\impl\MemberInterestServiceImpl.class]
↑     ↓
|  interestService defined in file [D:\Java\IdeaProjects\alliance-server\alliance-ray\target\classes\com\sinbyte\ray\delay\InterestService.class]
└─────┘

在场景中, MemberInterestServiceImpl 需要调用 InterestServicescheduleNextInterestTask() 方法,但由于这两个服务之间存在循环依赖,直接注入会导致 Spring 启动时发生循环依赖错误

解决方案:使用事件驱动或通过 ApplicationContext 手动获取 Bean

以下是一些可以解决循环依赖问题的方法:

1. 事件驱动设计

可以使用 Spring 的事件机制,将调用 scheduleNextInterestTask 的操作转变为事件驱动。具体做法是,当 MemberInterestServiceImpl 需要调用 scheduleNextInterestTask 时,发布一个自定义事件,InterestService 监听这个事件并执行相应的任务。

首先,定义一个自定义事件类:

import org.springframework.context.ApplicationEvent;
/*** 自定义事件驱动* @CreateDate: 2024/8/14 15:30*/
public class InterestTaskEvent extends ApplicationEvent {public InterestTaskEvent(Object source) {super(source);}
}

接着,在 MemberInterestServiceImpl 中发布事件,实现ApplicationEventPublisherAware并重写setApplicationEventPublisher方法:

import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Service;@Service
@AllArgsConstructor
public class MemberInterestServiceImpl extends ServiceImpl<MemberInterestMapper, MemberInterest> implements MemberInterestService, ApplicationEventPublisherAware {// 事件发布器private ApplicationEventPublisher eventPublisher;@Overridepublic void setApplicationEventPublisher(@NotNull ApplicationEventPublisher applicationEventPublisher) {// 注入事件发布器this.eventPublisher = applicationEventPublisher;}@Overridepublic Boolean updateExpireStatus(MemberInterestExpireStatus body) {// 省略其他代码...if (updateById(interest)) {// 省略其他代码...eventPublisher.publishEvent(new InterestTaskEvent(this));  // 发布事件return true;}}
}

InterestService 中监听这个事件:

import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;@Service
@AllArgsConstructor
public class InterestService {// 其他依赖...@EventListenerpublic void onInterestTaskEvent(InterestTaskEvent event) {scheduleNextInterestTask();}public void scheduleNextInterestTask() {// 省略其他代码...}
}

2. 使用 ApplicationContext 手动获取 Bean

如果你不希望使用事件驱动,还可以通过 Spring 的 ApplicationContext 手动获取 InterestService Bean,从而避免循环依赖。

MemberInterestServiceImpl 中引入 ApplicationContext 并在需要调用时获取 InterestService

import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Service;@Service
@Slf4j
@AllArgsConstructor
public class MemberInterestServiceImpl extends ServiceImpl<MemberInterestMapper, MemberInterest> implements MemberInterestService, ApplicationContextAware {private ApplicationContext applicationContext;private final RedisCache redisCache;private final PublicService publicService;private final MemberApplyBusinessService memberApplyBusinessService;private final MemberTransactionRecordService memberTransactionRecordService;private final MemberInterestPointService memberInterestPointService;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) {this.applicationContext = applicationContext;}@Overridepublic Boolean updateExpireStatus(MemberInterestExpireStatus body) {// 省略其他代码...if (updateById(interest)) {// 省略其他代码...InterestService interestService = applicationContext.getBean(InterestService.class);interestService.scheduleNextInterestTask();  // 手动获取 Bean 并调用方法return true;}throw new ServiceException("更新失败");}
}

3. 拆分逻辑

如果可能,考虑将 InterestService 的部分逻辑拆分到一个新的服务中,以减少 InterestServiceMemberInterestServiceImpl 之间的依赖关系。这可能需要对业务逻辑进行一定的重构,但从长期维护的角度来看,是一种更优雅的解决方案。

总结

通过以上方法,可以有效地解决循环依赖问题并在 MemberInterestServiceImpl 中安全地调用 InterestService 的方法。推荐使用事件驱动的方法,这不仅解决了循环依赖问题,还能让你的代码更具扩展性和松耦合。

生活不能过度的平坦,这样的生活才最有意义!

http://www.yayakq.cn/news/23201/

相关文章:

  • 简单易做的网站建网站可行性分析
  • 线上设计师网站国家高新技术企业认定官网
  • php做的网站如何该样式网站速度优化
  • 网站开发服务 税怎样找素材做网站
  • 济南网站建设 刘彬彬wordpress大开速度慢
  • 淄博网站制作定制优化职业培训机构有哪些
  • 网站费用预算平顶山哪里有做网站的公司
  • 手机网站设计与规划宁波网站优化方法
  • 网站后台登陆显示验证码错误网络seo优化
  • 零食网站建设策划书传媒公司怎么套路新人
  • wordpress主题制作的书关键词推广seo
  • 做网站外网可访问网络营销组织是什么
  • wordpress个人网站模板怎么通过微博做网站外链
  • wordpress网站百度收录首页线上编程课哪家好
  • 建设网站企业注册人员北京朝阳不限购小户型
  • 什么网站做美式软装设计网站开发培训班 上地
  • 怎么做自己的设计网站哪里可以免费申请空间 注册域名 申请网站
  • 做有色金属哪个网站好哈尔滨高端网页设计
  • 手机号电子邮箱免费注册seo网站设计就业前景
  • 做网站宣传公众号开发哪家好
  • 青岛高新区建设局网站优化大师app下载安装
  • 企业网站建设方案书怎么写做校园网站
  • 深圳 高端 建站公司ui设计师需要考什么证书
  • 宁波建站如何维护公司网页
  • dw网站制作手机软件下载wordpress娱乐资源网
  • 做厨具公司网站平面设计软件学哪个比较好
  • 给个网站好人有好报2021机械加工网上订单怎么接
  • 国家拨款农村建设查询的网站网站建设竞价托管外包
  • 一键网站制作app广州网站设计与制作公司
  • wordpress模版做网站乡村旅游电子商务网站建设