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

苏州h5网站frontpage制作个人网站 技巧

苏州h5网站,frontpage制作个人网站 技巧,工程业绩在哪个平台上查询,网站建设分工明细表Spring 框架通过 三级缓存 机制来解决循环依赖问题。循环依赖是指两个或多个 Bean 相互依赖#xff0c;形成一个闭环#xff0c;例如 Bean A 依赖 Bean B#xff0c;而 Bean B 又依赖 Bean A。Spring 通过提前暴露未完全初始化的 Bean 来解决这个问题。 以下是 Spring 解决…Spring 框架通过 三级缓存 机制来解决循环依赖问题。循环依赖是指两个或多个 Bean 相互依赖形成一个闭环例如 Bean A 依赖 Bean B而 Bean B 又依赖 Bean A。Spring 通过提前暴露未完全初始化的 Bean 来解决这个问题。 以下是 Spring 解决循环依赖的详细机制和流程 1. Spring Bean 的生命周期 在理解循环依赖之前需要了解 Spring Bean 的生命周期。Spring Bean 的创建过程主要包括以下步骤 实例化通过构造函数或工厂方法创建 Bean 的实例。属性填充将依赖的 Bean 注入到当前 Bean 中通过 Autowired、Resource 等注解或 XML 配置。初始化调用初始化方法如 PostConstruct、InitializingBean 的 afterPropertiesSet 方法。销毁在容器关闭时调用销毁方法。 循环依赖通常发生在 属性填充 阶段。 2. 三级缓存机制 Spring 通过三级缓存来解决循环依赖问题。三级缓存分别是 一级缓存Singleton Objects存储完全初始化好的单例 Bean。二级缓存Early Singleton Objects存储提前暴露的未完全初始化的 Bean仅实例化未填充属性。三级缓存Singleton Factories存储 Bean 的工厂对象ObjectFactory用于生成提前暴露的 Bean。 3. 解决循环依赖的流程 以下是一个典型的循环依赖场景 Bean A 依赖 Bean B。Bean B 依赖 Bean A。 Spring 解决循环依赖的流程如下 步骤 1创建 Bean A Spring 开始创建 Bean A调用构造函数实例化 Bean A。将 Bean A 的工厂对象ObjectFactory放入三级缓存。开始填充 Bean A 的属性发现 Bean A 依赖 Bean B。 步骤 2创建 Bean B Spring 开始创建 Bean B调用构造函数实例化 Bean B。将 Bean B 的工厂对象ObjectFactory放入三级缓存。开始填充 Bean B 的属性发现 Bean B 依赖 Bean A。 步骤 3解决 Bean B 的依赖 Spring 从三级缓存中获取 Bean A 的工厂对象生成 Bean A 的早期引用未完全初始化的 Bean A。将 Bean A 的早期引用放入二级缓存并从三级缓存中移除 Bean A 的工厂对象。将 Bean A 的早期引用注入到 Bean B 中。Bean B 完成属性填充和初始化成为一个完全初始化的 Bean。将 Bean B 放入一级缓存。 步骤 4完成 Bean A 的创建 Spring 将 Bean B 注入到 Bean A 中。Bean A 完成属性填充和初始化成为一个完全初始化的 Bean。将 Bean A 放入一级缓存并从二级缓存中移除 Bean A 的早期引用。 4. 代码示例 以下是一个简单的循环依赖示例 Component public class BeanA {Autowiredprivate BeanB beanB; }Component public class BeanB {Autowiredprivate BeanA beanA; }Spring 会通过三级缓存机制解决 BeanA 和 BeanB 之间的循环依赖。 5. 解决循环依赖的限制 Spring 的循环依赖解决方案有以下限制 仅支持单例 BeanSpring 只能解决单例作用域Singleton的 Bean 的循环依赖。原型作用域Prototype的 Bean 无法解决循环依赖。 构造函数注入无法解决循环依赖如果循环依赖是通过构造函数注入的Spring 无法解决。因为构造函数注入需要在实例化时完成依赖注入而三级缓存机制无法提前暴露未完全初始化的 Bean。 Component public class BeanA {private final BeanB beanB;Autowiredpublic BeanA(BeanB beanB) {this.beanB beanB;} }Component public class BeanB {private final BeanA beanA;Autowiredpublic BeanB(BeanA beanA) {this.beanA beanA;} }上述代码会抛出 BeanCurrentlyInCreationException 异常。 避免复杂的循环依赖虽然 Spring 可以解决简单的循环依赖但复杂的循环依赖可能会导致代码难以维护和理解应尽量避免。 6. 如何避免循环依赖 使用 Setter 注入或字段注入避免使用构造函数注入。重新设计代码通过重新设计类之间的关系消除循环依赖。使用 Lazy 注解延迟加载依赖的 Bean。Component public class BeanA {private final BeanB beanB;Autowiredpublic BeanA(Lazy BeanB beanB) {this.beanB beanB;} }7. 缓存状态的变化 以下是缓存状态的变化过程 步骤一级缓存 (singletonObjects)二级缓存 (earlySingletonObjects)三级缓存 (singletonFactories)创建 BeanA 实例后无无BeanA 的工厂对象创建 BeanB 实例后无无BeanA 和 BeanB 的工厂对象解决 BeanB 依赖后无BeanA 的早期引用BeanB 的工厂对象BeanB 创建完成后BeanBBeanA 的早期引用无BeanA 创建完成后BeanA 和 BeanB无无 总结 Spring 通过三级缓存机制解决了单例 Bean 的循环依赖问题但构造函数注入和原型 Bean 的循环依赖无法解决。在实际开发中应尽量避免循环依赖保持代码的清晰和可维护性。如果无法避免可以使用 Setter 注入或 Lazy 注解来解决。
http://www.hkea.cn/news/14468197/

相关文章:

  • 成都网站营销怎么写网站文案
  • 上海住房城乡建设网站证件查询中国500强企业排名
  • 长春建设工程管理中心网站不会编程能建网站
  • 怎么做网站备案wordpress 添加搜索
  • 安徽网站开发建设免费发布招聘信息的平台有哪些
  • 广州网站建设推广方法网站建站网站 小说
  • 网上申请个人营业执照网站icp主体备案号 网站备案号
  • 手机网站禁止缩放网站做seo 反应非常慢
  • 深圳网站建设维护服务邢台最新消息
  • 郑州做网站 熊掌号电商最重要的四个岗位
  • 网站建设应解决的问题微信里的小程序占内存吗
  • 营销网站建设的步骤在网上做贸易哪个网站好
  • 渭南建筑工程网广州seo外包公司
  • 网站上线具体流程要对网页中各个元素
  • 重庆网站建设cq装修设计公司哪个好
  • ipv6跟做网站有关吗网站功能组件
  • 深圳网页设计制作网站环球资源网是卖什么的
  • 学习建网站玩网站建设学习推广网页
  • 做网站为什么差价很大凡科网页版登陆入口
  • 我的网站模板下载阿里云 装wordpress
  • 购物网站支付功能怎么做如何做团购网站
  • dw做网站时怎么改为绝对路径群晖nas wordpress
  • 毕业设计论文网站开发需要多少钱网址建立快捷方式
  • 住房建设部网站 保定中关村手机报价大全官网
  • 余姚网站推广策划案建设网站的建设费用包括
  • 云速成美站做网站好吗深圳网页制作培训课程价格
  • 医联体网站建设网站 空间 服务器 免费
  • 免费域名网站黄的免费本机iis网站
  • 免费网站在线收看用asp做网站的可行性分析
  • 做网站用什么数据库网站排名优化和竞价