营销型的网站域名北京土人景观设计公司

张小明 2026/3/13 2:47:16
营销型的网站域名,北京土人景观设计公司,商城网站建站程序,网络营销师证书怎么考01-三级缓存的核心目的Spring 三级缓存主要解决两个核心问题#xff1a;单例 Bean 的循环依赖问题#xff1a;Bean A 依赖 Bean B#xff0c;Bean B 又依赖 Bean AAOP代理与循环依赖的兼容问题#xff1a;在循环依赖场景下#xff0c;如何确保注入的是正确的代理对象02-三…01-三级缓存的核心目的Spring 三级缓存主要解决两个核心问题单例 Bean 的循环依赖问题Bean A 依赖 Bean BBean B 又依赖 Bean AAOP代理与循环依赖的兼容问题在循环依赖场景下如何确保注入的是正确的代理对象02-三级缓存的完整定义public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry { // 第一级缓存完全初始化好的单例Bean private final MapString, Object singletonObjects new ConcurrentHashMap(256); // 第二级缓存提前暴露的单例Bean已实例化但未完成初始化 private final MapString, Object earlySingletonObjects new ConcurrentHashMap(16); // 第三级缓存单例工厂用于创建Bean的早期引用可能包含代理对象 private final MapString, ObjectFactory? singletonFactories new ConcurrentHashMap(16); // 正在创建中的Bean名称集合 private final SetString singletonsCurrentlyInCreation Collections.newSetFromMap(new ConcurrentHashMap(16)); // 已注册的单例Bean名称集合 private final SetString registeredSingletons new LinkedHashSet(256); }03-各级缓存详细说明3.1 一级缓存singletonObjects一级缓存存储完全初始化完成的 Bean 实例特点Bean 已经完成了所有初始化步骤实例化调用构造方法属性填充Autowired 注入初始化PostConstruct、InitializingBean如果有 AOP 代理存储的是代理对象线程安全支持并发访问存储的 Bean 可以直接被应用程序使用3.2二级缓存earlySingletonObjects二级缓存存储提前暴露的 Bean 实例已实例化但未完成属性注入特点Bean 已经实例化但尚未完成属性注入主要是为了解决循环依赖而临时存储如果 Bean 需要 AOP 代理这里存储的是代理对象从三级缓存的 ObjectFactory 创建后移入二级缓存3.3 三级缓存singletonFactories三级缓存存储ObjectFactory 工厂对象用于创建 Bean 的早期引用特点存储的是ObjectFactory?而不是 Bean 实例调用getObject()方法可以创建 Bean 的早期引用核心作用解决 AOP 代理与循环依赖的结合问题在 Bean 实例化后、属性注入前放入04-三级缓存的关键方法详解4.1addSingletonFactory()添加三级缓存将创建 Bean 的工厂放入三级缓存为循环依赖提供出口protected void addSingletonFactory(String beanName, ObjectFactory? singletonFactory) { synchronized (this.singletonObjects) { if (!this.singletonObjects.containsKey(beanName)) { // 放入三级缓存 this.singletonFactories.put(beanName, singletonFactory); // 从二级缓存移除保证数据一致性 this.earlySingletonObjects.remove(beanName); this.registeredSingletons.add(beanName); } } }4.2 getSingleton()获取单例Bean涉及所有三级缓存按 1→2→3 顺序查找三级缓存的查询逻辑protected Object getSingleton(String beanName, boolean allowEarlyReference) { // 快速检查一级缓存完全初始化的Bean Object singletonObject this.singletonObjects.get(beanName); if (singletonObject null isSingletonCurrentlyInCreation(beanName)) { synchronized (this.singletonObjects) { // 检查二级缓存提前暴露的Bean singletonObject this.earlySingletonObjects.get(beanName); if (singletonObject null allowEarlyReference) { // 检查三级缓存Bean工厂 ObjectFactory? singletonFactory this.singletonFactories.get(beanName); if (singletonFactory ! null) { // 调用工厂方法获取Bean的早期引用 singletonObject singletonFactory.getObject(); // 将获取到的Bean放入二级缓存 this.earlySingletonObjects.put(beanName, singletonObject); // 从三级缓存移除 this.singletonFactories.remove(beanName); } } } } return singletonObject; }4.3 getEarlyBeanReference()获取早期Bean引用从三级缓存 获取工厂时调用生成早期引用可能是代理对象protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) { Object exposedObject bean; // 如果BeanDefinition不是合成的非基础设施Bean且存在InstantiationAwareBeanPostProcessor if (!mbd.isSynthetic() hasInstantiationAwareBeanPostProcessors()) { for (BeanPostProcessor bp : getBeanPostProcessors()) { if (bp instanceof SmartInstantiationAwareBeanPostProcessor) { SmartInstantiationAwareBeanPostProcessor ibp (SmartInstantiationAwareBeanPostProcessor) bp; // 关键后置处理器可能返回代理对象 exposedObject ibp.getEarlyBeanReference(exposedObject, beanName); } } } return exposedObject; }05-完整流程演示A ↔ B 循环依赖 AOP假设有两个Service且A需要AOP代理Service Transactional // A需要事务代理 public class ServiceA { Autowired private ServiceB serviceB; public void methodA() { // 业务逻辑 } } Service public class ServiceB { Autowired private ServiceA serviceA; public void methodB() { // 业务逻辑 } }详细执行流程06-注意事项6.1 构造器注入无法使用三级缓存构造器调用时对象还未创建无法放入三级缓存因此无法解决循环依赖。Component public class ServiceA { private final ServiceB serviceB; Autowired // 构造器注入 public ServiceA(ServiceB serviceB) { this.serviceB serviceB; // 构造时就依赖B但B可能还未创建 // 此时ServiceA还未实例化完成ServiceA 无法放入三级缓存 } }6.2 原型Bean的循环依赖原型Bean不放入三级缓存每次请求都创建新实例Scope(prototype) Component public class PrototypeA { Autowired private PrototypeB b; } Scope(prototype) Component public class PrototypeB { Autowired private PrototypeA a; }Spring会直接抛出异常BeanCurrentlyInCreationException: Error creating bean with name prototypeA: Requested bean is currently in creation6.3 Async方法的特殊处理Async也是通过AOP实现的但处理时机不同需要在initializeBean阶段创建代理可能影响循环依赖Service public class AsyncService { Async public void asyncMethod() { // 异步方法 } Autowired private AnotherService anotherService; }07-总结缓存级别存储内容生命周期主要作用一级缓存完全初始化的BeanBean整个生命周期提供最终可用的Bean二级缓存早期Bean已实例化未初始化创建过程中临时存在解决循环依赖避免重复创建三级缓存ObjectFactory工厂对象Bean实例化后到初始化前处理AOP代理确保返回正确的代理对象核心思想通过懒加载的ObjectFactory延迟决策只有在真正发生循环依赖时才创建代理对象既解决了循环依赖问题又保持了Bean生命周期的完整性同时支持AOP等增强功能。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

一流的永州网站建设想要做网站的企业

FaceFusion在在线教育中打造个性化讲师形象的应用 如今的在线课堂早已不再是简单地把黑板搬到屏幕上。当MOOC平台动辄承载数十万学习者,当偏远地区的学生通过一根网线接触世界顶尖课程内容时,一个被长期忽视的问题逐渐浮现: 为什么我们看完了…

张小明 2026/3/11 20:46:49 网站建设

网站正在建设中色综合长春免费做网站

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个交互式Navicat15新手引导应用,包含以下模块:1.分步下载安装指南 2.连接第一个数据库的动画演示 3.简单查询构建器 4.常见错误提示解读。应用采用图文…

张小明 2026/3/11 23:28:37 网站建设

做一个网站建设的流程昆明网站建设

你是不是也有这样的感觉?当“大模型”、“AIGC”成为朋友圈和行业新闻的高频词时,作为一名程序员或对技术感兴趣的“小白”,既心潮澎湃,又不知从何下手。一边是“百万年薪抢人”的新闻层出不穷,另一边却是“35岁危机”…

张小明 2026/3/5 2:48:43 网站建设

龙岗网站建设icxun苏州注册公司可以用住宅地址吗

有时候使用用友T 时经常会遇到页面一直转圈,加载不出来的情况解决方案:点击电脑上的开始程序,找到畅捷通T服务管理器,点击切换到iis如果切换到iis失败,可在【控制面板】位置找到【程序】-【程序和功能】,点…

张小明 2026/3/5 2:48:44 网站建设

投标建设用地是哪个网站上海上网app

你大概率是混淆了概念,TEFP 并非腾讯云国际站代理商相关计划,而是腾讯企业金融服务平台(Tencent Enterprise Fintech Platform) 的缩写。它是腾讯云推出的助力中小微企业普惠融资的产品,并非面向国际站代理商的体系。而…

张小明 2026/3/5 5:51:18 网站建设