依赖循环分析

53 阅读2分钟

1、事务失效(场景一)

本业务中的事务方法调用了本类中另一个事务方法。事务失效,原因是this发起调用,并不是代理对象。

##2. 循环依赖

A、B都是spring容器中的bean,A中有一个属性是B【A依赖于B】,B同样依赖于A。就会出现循环依赖问题

如何解决

一.什么是三级缓存

1.一级缓存:存放已经初始化完成的Bean

2.二级缓存:存放半成品Bean,既实例化完成未初始化的Bean。

3.三级缓存:存放bean工厂 set的依赖注入,spring通过三级缓存【三个map】解决的

image.png 创建A【要注入B】 ---> A实例化,没有初始化, A在三级缓存放创建对象的代理工厂,用来创建对象 ---> 从容器中获取并注入B ---> 初始化B【实例化B,注入A】 --->(先从一级缓存找) 最后从三级缓存中获取创建A的工厂,获取到A的半成品对象,放入到二级缓存中,删除三级缓存中的创建A的工厂【得到一个半成品A】 ---> 于是B就初始化完成了,把B从二级缓存中移动到一级缓存中,B就完成了初始化,是一个完整的bean ---> 继续完成A的初始化,从一级缓存中获取注到B,注入A,把A从二级缓存中移动到一级缓存中,A就完成了初始化

工厂内部是一个内部是一个Lambda表达式 实际开发中,尽量手动去避免循环依赖的产生,最好解决方案是把BService要调用AService的方法提取到一个新的Service,如 CService

image.png

3接口防抖

我们是基于自定义注解+AOP+分布式锁的形式实现了订单的重复提交问题。

Key:业务前缀+用户ID+服务ID+服务开始时间

3、订单优化

  1. 远程接口如何避免雪崩问题
  2. 事务方法使用数据库连接不要过长(长事务方法,会耗性能)
  3. 可以写一个新的方法调用来避免长事务问题.