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

wordpress文章搬家seo资源

wordpress文章搬家,seo资源,百度推广官方,集团网站建设案例文章目录 前言一、Spring解决循环依赖时,为什么要使用三级缓存? 前言 Spring解决循环依赖的手段,是通过三级缓存: singletonObjects:存放所有生命周期完整的单例对象。(一级缓存)earlySingleto…

文章目录

  • 前言
  • 一、Spring解决循环依赖时,为什么要使用三级缓存?


前言

  Spring解决循环依赖的手段,是通过三级缓存

  • singletonObjects:存放所有生命周期完整的单例对象。(一级缓存)
  • earlySingletonObjects:存放所有完成了实例化操作的早期单例对象。(二级缓存)
  • singletonFactories:存放单例工厂的对象,通过工厂创建早期Bean。(三级缓存)
    在这里插入图片描述
      具体Spring是如何解决循环依赖问题的,在Spring循环依赖源码分析中已经详细说明,本篇侧重于证明三级缓存的必要性。

一、Spring解决循环依赖时,为什么要使用三级缓存?

  这是一道非常经典的面试题。如果一个对象需要被代理,那首先需要生成一个普通的对象,而代理对象和普通对象是不能同时存在于容器中的,当一个对象需要使用代理的时候,就要使用代理对象覆盖掉原来的普通对象。
  这是一个典型的循环依赖场景,存在两个相互引用的 Bean:A 和 B。其中 A 包含 b 属性,B 包含 a 属性。无论是否存在循环依赖,这两个 Bean 在完成实例化后都会自动存入三级缓存。需要注意的是,通过反射创建的实例对象与放入三级缓存工厂中的对象实际上是同一个引用在这里插入图片描述
  然后A对象执行属性注入,发现需要B属性,B在容器中是不存在的,于是需要去创建B对象。
  B对象在执行属性注入,发现需要A属性,需要从容器中获取:
在这里插入图片描述
  这里从三级缓存中,可以获取到创建A对象的工厂方法,如果A对象需要AOP,则会:
在这里插入图片描述
  为B的A属性赋值时,使用的是经过AOP处理的A对象。在B完成初始化后,A对象完成属性注入并继续初始化流程,此时不会再次进行AOP处理。这意味着A对象和B对象中的A属性实际上指向同一个经过AOP处理的对象实例。这就是三级缓存存在的意义。
  如果仅使用二级缓存,给B的A属性赋值的是未经AOP处理的原始A对象。随后A继续完成后续生命周期并经过AOP处理,导致最终生成的A对象与B持有的A对象不同——前者经过AOP增强,而后者仍是原始对象


  这里可能会有一个疑惑的点,那就是,A对象和B中的A属性应该是同一个实例,如果A继续完成后续生命周期并执行AOP处理,最终将成为AOP增强对象。那么即便最初B获取A属性时,A尚未经过AOP处理,当A完成整个流程后,B中的A是否也会自动成为AOP增强对象?
  答案是否定的,因为Spring 中对 A 做 AOP 是通过“生成一个新的代理对象”,而不是修改原始 A 的引用本身:

  • B 中的 a 是早期注入进去的,它的类型是原始 A
  • Spring 后续创建了 proxyA,它是一个新对象,代理了原始 A
  • 但此时 B 中早就注入好了,不会“回头替换”那个引用
  • 所以 B 中的 A 就是原始对象,没有事务、没有切面

  一个简单案例即可证明:

public class MyService {public void doSomething() {System.out.println("Doing something...");}
}
@Aspect
public class LogAspect {@Before("execution(* MyService.*(..))")public void before() {System.out.println(">>> [AOP] Before method execution");}
}
public class AopTest {public static void main(String[] args) {MyService target = new MyService();// 创建代理工厂并添加切面AspectJProxyFactory factory = new AspectJProxyFactory(target);factory.addAspect(new LogAspect());// 获取代理对象MyService proxy = factory.getProxy();System.out.println("target = " + target.getClass());System.out.println("proxy  = " + proxy.getClass());System.out.println("是否同一引用: " + (target == proxy));proxy.doSomething();}
}

在这里插入图片描述

http://www.dtcms.com/wzjs/377393.html

相关文章:

  • 网站有什么类型百度文库官网首页
  • 网站建设有哪些常用行为百度热线客服24小时
  • 长沙软件开发培训机构网站优化技术
  • 帮人做网站收费合法吗长沙优化网站厂家
  • 什么网站动物和人做的吗win10系统优化工具
  • c 做网站优点百度seo关键词优化电话
  • wordpress移动端顶部导航栏东莞网站推广优化公司
  • 简述网站内容如何优化网络营销推广方式
  • 怎样做好邯郸网站建设山东网站建设
  • 建筑模板是干什么用的防疫优化措施
  • 公司网站建设有哪些公司可以做线上推广渠道主要有哪些
  • 成都网站建设大公司营销模式有哪些
  • app开发培训课程seo基础教程
  • 设计官方网站2024很有可能再次封城吗
  • wordpress迁移器关键词优化怎么弄
  • 上海住房和城乡建设网站自制网站 免费
  • 网站备案 代办百度推广产品
  • 第一素材网深圳seo推广培训
  • 菠菜导航网站可以做樱花12e56
  • 爱奇艺会员做任务送十天网站qq刷赞网站推广快速
  • 手机网站和pc网站北京seo推广外包
  • 手机网站制作费百度知道小程序
  • 对网站建设的考核机制网页设计模板网站
  • 富顺网站建设网页是怎么制作的
  • 自己做的网站链接关键词seo优化公司
  • 铜陵公司做网站网站内部优化有哪些内容
  • 在织梦网站做静态网页影视网站怎么优化关键词排名
  • 建企业网站浩森宇特昆明网络推广方式有哪些
  • 网站建设 提升和扩大百度推广年费多少钱
  • 做百度移动端网站排名关键词可以分为哪三类