SpringBoot依赖循环如何解决

问题描述:

之前公司开发用的是JeeSite快速开发平台,代码生成工具生成的Service不是面向接口的,没有做服务接口和服务实现的分离,加上公司原因导致项目逻辑混乱,各种Service循环依赖,耦合度极高。

问题补充:

Spring默认通过三级缓存解决了循环依赖的问题,为什么项目启动还是会报错?有兴趣的可以查看此文档Spring如何解决循环依赖

问题解决

方法一:定义各个Service的逻辑,抽取公共模块

  • 最根本的方法,定义各个Service的逻辑,抽取公共模块,禁止循环依赖。但是成本太高。

方法二:重构Service层,使其面向接口

  • 推荐方法,重构Service层,使其面向接口,所有Service的依赖均依赖接口而非实现类。
  • 比如:UserService类,改为接口,并新增UserServiceImpl实现类,所有都依赖UserService而不是Impl。

方法三:Service层直接注入目标Service的Dao层

  • 易实现的方法,Service层直接注入目标Service的Dao层。治标不治本,项目逻辑会更加混乱。
  • 比如:UserService需要依赖OfficeService,可以直接改成注入OfficeDao。

方法四:Spring官方推荐,将Field注入方式改成setter注入!

  • 将Field注入方式改成setter注入。
  • 比如:
    @Autowired
    private UserService userService;
    
    改成
    private UserService;
    
    @Autowired
    public void setUserService(UserService userService){
      this.userService = userService
    }
    

方法五:最简单的方法:懒加载

  • 懒加载,在冲突的类注入时,加入@Lazy
  • 比如:UserService需要依赖OfficeService,OfficeService需要依赖UserService。直接在其一的依赖注入后面新增@Lazy注解。
    @Autowired
    @Lazy
    private UserService userService;
    
  • 也可以开启全局懒加载
    spring:
      main:
        lazy-initialization: true
    

你可能感兴趣的:(SpringBoot依赖循环如何解决)