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

最牛html5网站建设品牌营销策划案例

最牛html5网站建设,品牌营销策划案例,护肤网站模版,买域名去哪个网站好SmartInstantiationAwareBeanPostProcessor 解决循环依赖的过程, 例如上面的 A依赖B, B依赖A SmartInstantiationAwareBeanPostProcessor 是 Spring 中的一个接口,它扩展了 InstantiationAwareBeanPostProcessor 接口并提供了对 Bean 的实例化和属性填充的更高级的…

SmartInstantiationAwareBeanPostProcessor 解决循环依赖的过程, 例如上面的 A依赖B, B依赖A

SmartInstantiationAwareBeanPostProcessor 是 Spring 中的一个接口,它扩展了 InstantiationAwareBeanPostProcessor 接口并提供了对 Bean 的实例化和属性填充的更高级的控制。在 Spring Boot 项目中,SmartInstantiationAwareBeanPostProcessor 通过三级缓存机制解决了循环依赖的问题。以 A 依赖 B,B 依赖 A 为例,我们来了解下这个过程:

  1. 当容器开始实例化 A 时,首先会调用 SmartInstantiationAwareBeanPostProcessor#predictBeanType 方法来预测 Bean 的类型。如果可以预测到类型,Spring 会优先使用这个类型来实例化对象。

  2. 接下来会调用 SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference 方法获取 A 的提前暴露的引用。这个引用通常是一个代理对象,它可以处理 A 对 B 的依赖。

  3. 将 A 的提前暴露引用放入三级缓存。三级缓存分别是 singletonObjects、earlySingletonObjects 和 singletonFactories。其中,singletonObjects 用于存放完全初始化好的单例 Bean,earlySingletonObjects 用于存放提前暴露的 Bean 引用,singletonFactories用于存放原始 Bean 的工厂对象。在这个例子中,A 的提前暴露引用会被放入 earlySingletonObjects 缓存。

  4. 接下来,容器开始实例化 B。同样地,会调用 SmartInstantiationAwareBeanPostProcessor#predictBeanType 和 SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference 方法获取 B 的提前暴露引用,并将其放入 earlySingletonObjects 缓存。

  5. 当 B 的实例化完成后,开始填充属性。这时会发现 B 依赖 A,于是会从三级缓存中获取 A 的引用。由于 A 正在创建过程中,所以从 earlySingletonObjects 缓存中获取到了 A 的提前暴露引用。将 A 的引用设置到 B 的属性上,完成 B 的属性填充。

  6. B 的实例化和属性填充完成后,将 B 从 earlySingletonObjects 移动到 singletonObjects 缓存中。

  7. 接下来,开始填充 A 的属性。由于 A 依赖 B,会从三级缓存中获取 B 的引用。此时,B 已经完全初始化完成,所以从 singletonObjects 缓存中获取到了 B 的引用。将 B 的引用设置到 A 的属性上,完成 A 的属性填充。

  8. A 的实例化和属性填充完成后,将 A 从 earlySingletonObjects 移动到 singletonObjects 缓存中。至此,A 和 B 的循环依赖解决了。

  9. 容器会继续调用各个 BeanPostProcessor 的 postProcessAfterInitialization 方法,对 A 和 B 进行后置处理。这些后置处理可能包括代理对象的创建等操作。

  10. 最后,A 和 B 的实例化和属性填充完成,循环依赖被成功解决。容器将 A 和 B 的引用提供给其他需要它们的 Bean。

通过以上流程,Spring Boot 利用 SmartInstantiationAwareBeanPostProcessor 和三级缓存机制成功地解决了 A 和 B 之间的循环依赖问题。这种处理方式不仅保证了 Bean 实例化的正确性,还确保了容器在解决循环依赖时的高性能。

总结

SmartInstantiationAwareBeanPostProcessor 是一个 Spring 容器中的扩展点,它本身并不直接解决循环依赖问题。Spring 容器在解决循环依赖时,主要依赖于 DefaultSingletonBeanRegistry 类中的 getSingleton() 方法,该方法使用了三级缓存来处理循环依赖。
上述过程仅适用于属性注入的情况
SmartInstantiationAwareBeanPostProcessor,它提供了一些扩展点,允许我们在 Spring 容器创建和初始化 Bean 实例的过程中进行干预。例如,我们可以使用它来改变实例化策略、解析依赖关系或者修改属性值等。然而,SmartInstantiationAwareBeanPostProcessor 本身并不直接参与解决循环依赖问题。

总之,Spring 容器通过三级缓存解决属性注入的循环依赖问题。然而,对于构造器注入的循环依赖,我们需要调整代码结构或使用其他技术手段来解决。SmartInstantiationAwareBeanPostProcessor 是一个扩展点,允许我们在 Bean 实例创建和初始化的过程中进行干预,但它本身并不直接解决循环问题

在实际项目中,我们应尽量避免产生循环依赖,以降低代码的复杂度。当循环依赖确实需要解决时,可以尝试以下方法:

使用属性注入而非构造器注入,让 Spring 容器自动处理循环依赖问题。
提取接口,将 A 和 B 的公共功能抽取为接口,然后让 A 和 B 分别依赖这些接口,而不是直接依赖彼此。
使用事件驱动或消息队列,将 A 和 B 之间的交互转移到事件驱动或消息队列中,这样可以避免直接的循环依赖。
调整代码结构,如使用中介者模式、模块化设计等方法,将循环依赖拆分为线性依赖

http://www.zhongyajixie.com/news/3373.html

相关文章:

  • 在线旅游网站建设前的调研淘宝seo优化是什么
  • 什么是网站分析东莞seo优化团队
  • 增城有什么网站做招聘的品牌推广是做什么的
  • 单页营销型网站怎么查百度收录
  • 企业网络架构拓扑图济南seo排名优化推广
  • 简易制作网站baidu百度
  • 建设企业网站企业网上银行登录官网百度小说搜索风云排行榜
  • 网站建设 域名 管理站长工具seo综合查询columbu cat
  • 贵阳 网站建设seo优化推广软件
  • 网站banner怎么设计seo网络推广技术
  • 在哪个网站可以学做甜点吸引顾客的营销策略
  • 贵州省建设职业技术学院网站seo免费推广
  • wordpress被封锁了广州seo学徒
  • wordpress有哪些好模版seo技术306
  • 什么网站做简历东莞网站制作公司联系方式
  • 邢台网站建设平台2021全国大学生营销大赛
  • 做网站用哪些语言手机建站平台
  • 上网站 ftp简述企业网站推广的一般策略
  • 网站欣赏公司网站案例怎么去推广一个app
  • 免费正能量励志网站武汉网络推广
  • 重庆seo网站建设百度贴吧首页
  • 罗琳做的网站做竞价托管的公司
  • 关于茶文化网站建设的背景搜索大全引擎入口
  • 做天猫还是做网站推广优化营商环境 提升服务效能
  • 做网站公司松江互联网营销师
  • 重庆网站建设解决方案临沂网站建设
  • 35公司做的网站漏洞微帮推广平台怎么加入
  • 做网站 就上凡科网大连企业网站建站模板
  • 做网站的框架模版外贸网站设计
  • wordpress 显示点击数廊坊seo外包公司费用