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

湖北黄冈疫情最新情况/企业网站如何优化

湖北黄冈疫情最新情况,企业网站如何优化,网站域名301,国际近期新闻点击上方“Java基基”,选择“设为星标”做积极的人,而不是积极废人!每天 14:00 更新文章,每天掉亿点点头发...源码精品专栏 原创 | Java 2021 超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框…

点击上方“Java基基”,选择“设为星标”

做积极的人,而不是积极废人!

每天 14:00 更新文章,每天掉亿点点头发...

源码精品专栏

 
  • 原创 | Java 2021 超神之路,很肝~

  • 中文详细注释的开源项目

  • RPC 框架 Dubbo 源码解析

  • 网络应用框架 Netty 源码解析

  • 消息中间件 RocketMQ 源码解析

  • 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析

  • 作业调度中间件 Elastic-Job 源码解析

  • 分布式事务中间件 TCC-Transaction 源码解析

  • Eureka 和 Hystrix 源码解析

  • Java 并发源码

来源:juejin.cn/post/6895753832815394824

  • 循环依赖问题全景图

  • 什么是循环依赖问题?

  • 以上案例有几种循环依赖问题?

  • 如何解决循环依赖问题?

  • Spring三大缓存介绍

  • 总结

b13779aa47c0a0c07f73681a7d3ab6e5.png


循环依赖问题全景图

75a2b2cc83df785ab48056cb6ea8ceea.png

推荐下自己做的 Spring Boot 的实战项目:

https://github.com/YunaiV/ruoyi-vue-pro

什么是循环依赖问题?

类与类之间的依赖关系形成了闭环,就会导致循环依赖问题的产生。

比如下图中A类依赖了B类,B类依赖了C类,而最后C类又依赖了A类,这样就形成了循环依赖问题。

9154c4115807a18223a5ba077e634e91.png

演示代码:

public class ClassA {private ClassB classB;public ClassB getClassB() {return classB;}public void setClassB(ClassB classB) {this.classB = classB;}
}
public class ClassB {private ClassA classA;public ClassA getClassA() {return classA;}public void setClassA(ClassA classA) {this.classA = classA;}
}

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="classA" class="ioc.cd.ClassA"><property name="classB" ref="classB"></property></bean><bean id="classB" class="ioc.cd.ClassB"><property name="classA" ref="classA"></property></bean>
</beans>

测试代码:

@Testpublic void test() throws Exception {// 创建IoC容器,并进行初始化String resource = "spring/spring-ioc-circular-dependency.xml";ApplicationContext context = new ClassPathXmlApplicationContext(resource);// 获取ClassA的实例(此时会发生循环依赖)ClassA classA = (ClassA) context.getBean(ClassA.class);}

通过Spring IOC流程的源码分析循环依赖问题:

f099902c95a12630ec3d01bdd5fa9cf7.png

推荐下自己做的 Spring Cloud 的实战项目:

https://github.com/YunaiV/onemall

以上案例有几种循环依赖问题?

循环依赖问题在Spring中主要有三种情况:

  • 通过构造方法进行依赖注入时产生的循环依赖问题。

  • 通过setter方法进行依赖注入且是在多例(原型)模式下产生的循环依赖问题。

  • 通过setter方法进行依赖注入且是在单例模式下产生的循环依赖问题。

注意:在Spring中,只有【第三种方式】的循环依赖问题被解决了,其他两种方式在遇到循环依赖问题时都会产生异常。

其实也很好解释:

  • 第一种构造方法注入的情况下,在new对象的时候就会堵塞住了,其实也就是”先有鸡还是先有蛋“的历史难题。

  • 第二种setter方法&&多例的情况下,每一次getBean()时,都会产生一个新的Bean,如此反复下去就会有无穷无尽的Bean产生了,最终就会导致OOM问题的出现。

如何解决循环依赖问题?

那Spring到底是如何解决的setter方法依赖注入引起的循环依赖问题呢?请看下图(其实主要是通过两个缓存来解决的):

35ab7c1b5a8a0489b5985ca357dc397c.png

Spring三大缓存介绍

Spring中有三个缓存,用于存储单例的Bean实例,这三个缓存是彼此互斥的,不会针对同一个Bean的实例同时存储。

如果调用getBean,则需要从三个缓存中依次获取指定的Bean实例。读取顺序依次是一级缓存-->二级缓存-->三级缓存

4b4f0113670519c937828165b7984a27.png
一级缓存:Map<String, Object> singletonObjects

第一级缓存的作用?

  • 用于存储单例模式下创建的Bean实例(已经创建完毕)。

  • 该缓存是对外使用的,指的就是使用Spring框架的程序员。

存储什么数据?

  • K:bean的名称

  • V:bean的实例对象(有代理对象则指的是代理对象,已经创建完毕)

第二级缓存:Map<String, Object> earlySingletonObjects

第二级缓存的作用?

  • 用于存储单例模式下创建的Bean实例(该Bean被提前暴露的引用,该Bean还在创建中)。

  • 该缓存是对内使用的,指的就是Spring框架内部逻辑使用该缓存。

  • 为了解决第一个classA引用最终如何替换为代理对象的问题(如果有代理对象)请爬楼参考演示案例

存储什么数据?

  • K:bean的名称

  • V:bean的实例对象(有代理对象则指的是代理对象,该Bean还在创建中)

第三级缓存:Map<String, ObjectFactory<?>> singletonFactories

第三级缓存的作用?

  • 通过ObjectFactory对象来存储单例模式下提前暴露的Bean实例的引用(正在创建中)。

  • 该缓存是对内使用的,指的就是Spring框架内部逻辑使用该缓存。

  • 此缓存是解决循环依赖最大的功臣

存储什么数据?

  • K:bean的名称

  • V:ObjectFactory,该对象持有提前暴露的bean的引用

522369fb306fb59f63b3bcd1bb979997.png

为什么第三级缓存要使用ObjectFactory?需要提前产生代理对象。

6024adcecbad4ecda689985079b1f92e.png

什么时候将Bean的引用提前暴露给第三级缓存的ObjectFactory持有?时机就是在第一步实例化之后,第二步依赖注入之前,完成此操作。

6dd227c3df1363d1a3b553a7ab105f68.png

总结

以上就是Spring解决循环依赖的关键点!总结来说,就是要搞清楚以下几点:

  • 搞清楚Spring三级缓存的作用?

  • 搞清楚第三级缓存中ObjectFactory的作用?

  • 搞清楚为什么需要第二级缓存?

  • 搞清楚什么时候使用三级缓存(添加和查询操作)?

  • 搞清楚什么时候使用二级缓存(添加和查询操作)?

  • 当目标对象产生代理对象时,Spring容器中(第一级缓存)到底存储的是谁?



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

8f8bcaf89248de85bab5504c850318cc.png

已在知识星球更新源码解析如下:

c9a57ad4e2b33bd3c8bb5b271c07cdb7.png

c7789a028a2b7cdb30ba2fb447eb061e.png

a82e626d2f1ac9ebb62356f01447f40b.png

647621281ea2df1d1e085f761329f3fe.png

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 6W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
http://www.lbrq.cn/news/1265113.html

相关文章:

  • 动态网站开发的集成软件/抖音seo什么意思
  • 单位不能建设网站/吉林百度seo公司
  • 企业营销型网站建设方案/seo必备软件
  • 无锡君通科技服务有限公司/搜索引擎优化教程
  • 做淘宝网站怎么弄的/怎么用模板做网站
  • 哪个网站专业做代购护肤品/佛山网站优化软件
  • 怎么发布自己做的网站/it培训机构出来能找到工作吗
  • 海尔集团电商网站建设/关键词排名霸屏代做
  • 南昌企业建站/西安seo服务
  • 企业oa办公系统大概多少钱一套/开鲁seo服务
  • 江门那里做公司网站好/广州优化公司哪家好
  • 做爰片免费网站给我看看/google首页
  • 网站推广优化教程/seo研究所
  • 太原seo网站管理/百度网盘官网入口
  • 做宣传图册在什么网站/青岛网站seo
  • 什么公司需要网站建设/深圳网站seo哪家快
  • 山东兴润建设有限公司网站/南京怎样优化关键词排名
  • 省建设厅网站安徽/百度大数据查询
  • 景区门户网站建设/湖南seo优化首选
  • 武汉洪山区做网站的公司/痘痘如何去除效果好
  • 浙江+外贸网站建设/电商网络营销
  • 网站与域名的关系/百度榜单
  • 网站做担保交易/b站视频推广网站
  • 做网站不需要原件吧/百度免费推广有哪些方式
  • 做电子商务网站需要什么手续/网站制作多少钱一个
  • 响水做网站的价格/搜索引擎关键词优化方案
  • 网站app在线制作/优化流程
  • 网站建设链接/互联网营销做什么
  • 手机端网站建设方案/什么平台打广告比较好免费的
  • 网站后台操作流程/小红书怎么推广
  • openwrt 23.05编译intel igb5.19.4驱动
  • 《基于通道注意力与空洞卷积的胸片肺气肿检测算法》论文解析
  • 井盖识别数据集-2,700张图片 道路巡检 智能城市
  • python工具方法51 视频数据的扩充(翻转、resize、crop、re_fps)
  • React中的Hooks
  • C++ 指针常量 常量指针