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

资阳建网站qq群怎么推广起来最快

资阳建网站,qq群怎么推广起来最快,海南省住房公积金管理局网上办事大厅,邯郸 网站建设解决方案 使用提前暴露机制三级缓存进行解决 singletonObjects一级缓存,存放完整的 Bean。earlySingletonObjects二级缓存,存放提前暴露的Bean,Bean 是不完整的,未完成属性注入和执行 init 方法。singletonFactories三级缓存(用…

解决方案

使用提前暴露机制+三级缓存进行解决

singletonObjects一级缓存,存放完整的 Bean。
earlySingletonObjects二级缓存,存放提前暴露的Bean,Bean 是不完整的,未完成属性注入和执行 init 方法。
singletonFactories三级缓存(用Map类型的该参数来存放beanName和beanFactory之间的关系),存放的是 Bean 工厂(通过BeanFactory的getObject拿到实例,然后重新将值赋给二级缓存)。

这里只用 A,B 形成的循环依赖来举例:

  1. 实例化 A,此时 A 还未完成属性填充和初始化方法(@PostConstruct)的执行,A 只是一个半成品。
  2. 为 A 创建一个 Bean 工厂,并放入到 singletonFactories 中。
  3. 发现 A 需要注入 B 对象,但是一级、二级、三级缓存均为发现对象 B。
  4. 实例化 B,此时 B 还未完成属性填充和初始化方法(@PostConstruct)的执行,B 只是一个半成品。
  5. 为 B 创建一个 Bean 工厂,并放入到 singletonFactories 中。
  6. 发现 B 需要注入 A 对象,此时在一级、二级未发现对象 A,但是在三级缓存中发现了对象 A,从三级缓存中得到对象 A(通过工厂生成半成品Bean,提前暴露),并将对象 A 放入二级缓存中,同时删除三级缓存中的对象 A。(注意,此时的 A 还是一个半成品,并没有完成属性填充和执行初始化方法)
  7. 将对象 A 注入到对象 B 中。
  8. 对象 B 完成属性填充,执行初始化方法,并放入到一级缓存中,同时删除二级缓存中的对象 B。(此时对象 B 已经是一个成品)
  9. 对象 A 得到对象 B,将对象 B 注入到对象 A 中。(对象 A 得到的是一个完整的对象 B)
  10. 对象 A 完成属性填充,执行初始化方法,并放入到一级缓存中,同时删除二级缓存中的对象 A。

思考1:

只使用一级缓存,是否可以解决循环依赖

答案是否定的,Bean的创建过程 createBeanInstance --> populateBean --> initializeBean,可以推断出是在initializeBean才插入一级缓存的

由上面推断 initializeBean 的时候记录缓存,在循环依赖的情况,需要在 populateBean(第二阶段) 的时候再去注入循环依赖的 bean,此时,缓存中是没有循环依赖的 bean 的,就会导致 bean 重新创建实例。

如果被循环依赖的 bean 是一个 AOP 增强的代理 bean 的话,bean 的原始引用和最终产生的 AOP 增强 bean 的引用是不一样的,一级缓存就搞不定了。

当 aop 代理 bean 被循环依赖时,getBean() 操作从缓存中获取到的是一级缓存中存放的原始对象,而不是代理对象。

  • 假如createBeanInstance 之后就生成代理对象提前放入一级缓存呢?

答案是否定的,如果在 populateBean 之前生成的是一个代理对象的话,会导致一个问题 :jdk proxy 产生的代理对象是实现的目标类的接口,jdk proxy 的代理类通过 BeanWrapper 去利用反射设置值时会因为找不到相应的属性或者方法而报错。

思考2:

不需要第三级缓存,是否可以解决循环依赖?

答案是可以的,二级缓存来解决循环依赖的话,那么每个 bean 的创建流程中都需要插入一个流程——创建 bean 的早期引用(提前暴露)放入二级缓存。其实,在真实的开发中,绝大部分的情况下都不涉及到循环依赖而且 createBeanInstance --> populateBean --> initializeBean 这个流程也更加符合常理。所以,猜想 Spring 不用二级缓存来解决循环依赖问题,是为了保证处理时清晰明了,bean 的创建就是三个阶段: createBeanInstance --> populateBean --> initializeBean
只有碰到 AOP 代理 bean 被循环依赖时的场景,才去特殊处理,提前生成 AOP 代理 bean

思考3:

去掉二级缓存,是否可以解决循环依赖?

答案是否定的,在AOP的前提下,这么一种场景,B 和 C 都依赖了 A。singletonFactory.getObject() 获取的是代理对象。多次调用该方法返回的代理对象是不同的。

思考4:

Spring 一开始提前暴露的并不是实例化的 Bean,而是将 Bean 包装起来的 ObjectFactory。为什么要这么做呢?

这实际上涉及到 AOP,如果创建的 Bean 是有代理的,那么注入的就应该是代理 Bean,而不是原始的 Bean。但是 Spring 一开始并不知道 Bean 是否会有循环依赖,通常情况下(没有循环依赖的情况下),Spring 都会在完成填充属性,并且执行完初始化方法之后再为其创建代理。但是,如果出现了循环依赖的话,Spring 就不得不为其提前创建代理对象,否则注入的就是一个原始对象,而不是代理对象。Spring 的做法就是在 ObjectFactory 中去提前创建代理对象。

 Spring 需要三级缓存的目的是为了在没有循环依赖的情况下,延迟代理对象的创建

http://www.15wanjia.com/news/186162.html

相关文章:

  • 官方网站域名备案中联建设集团网站
  • 开网站设计公司多少钱库尔勒西部建设网站
  • 广东网站营销seo方案广东东莞最新消息通知
  • 湖北华亚建设工程有限公司网站电商网站有哪些
  • 深圳市建设银行网站首页江苏亿之盛建设有限公司网站
  • 网站设计公司杭州网站开发英文论文
  • 北京会所网站推广在线室内设计网站
  • php网站开发技术要点wordpress 域名米表
  • 宠物网站建设的可行性如何创建网站设计
  • 建网站软件工具达州市住房与城乡建设厅网站
  • 教你做文案的网站推荐深圳住房建设局网站
  • 唐山网站专业制作免费访问国外网站的app
  • 重庆长寿网站设计公司推荐南通住房和城乡建设局网站
  • 网站开发是什么费用网站开发公司方案报价
  • 2017年内蒙古建设厅网站网站开发后台数据怎么来
  • 沧州网站艰涩很wordpress 灯箱
  • 做动画 的 网站网站建设公司领导致辞
  • 哪个网站公司做的好荣耀商城app
  • 杭州文化传媒类高端网站建设公司做网站有要求吗
  • 四川省的建设厅注册中心网站晓风彩票网站建设软件
  • 旅游网网站的设计网站架构计划书
  • 门户网站建设服务网站建设目标是什么
  • 自己建服务器做网站违法廊坊哪里做网站好
  • 国外的自建站平台是什么在线设计制作
  • 南京快速建站模板下载互助网站制作公司
  • 个人怎么做动漫短视频网站网站欢迎页面代码
  • php网站开发参考书籍微信商城在哪里点开
  • 茂名市建设银行网站项目从立项到施工的程序
  • 网站服务器不稳定怎么打开网页视觉设计网站有哪些
  • 电子商务网站登录简述网站建设的基本流程图