指纹定制网站云渲染网站开发

张小明 2025/12/31 10:34:44
指纹定制网站,云渲染网站开发,wordpress tag伪静态规则,设计工作室装修效果图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进行投诉反馈,一经查实,立即删除!

档案网站建设规范有哪些html登录页面代码

目录 一、硬件驱动开发基础入门1.1 驱动程序的角色与意义1.2 常见驱动程序类型剖析 二、开发前的准备工作2.1 搭建开发环境2.2 了解硬件设备 三、驱动开发核心流程3.1 需求分析与架构设计3.2 编码实现3.3 测试与调试 四、实战案例:以网卡驱动开发为例4.1 项目背景与…

张小明 2025/12/30 10:30:27 网站建设

嵩明网站建设wordpress pdo

项目亮点速览 【免费下载链接】rpcs3 PS3 emulator/debugger 项目地址: https://gitcode.com/GitHub_Trending/rp/rpcs3 RPCS3作为全球领先的开源PS3模拟器,凭借其卓越的兼容性和性能表现,让玩家能够在PC平台上重温经典PS3游戏。该项目支持Window…

张小明 2025/12/30 16:21:19 网站建设

如何优化网站加载速度北京百度seo代理

第一章:工业质检Agent的缺陷识别在现代智能制造体系中,工业质检Agent承担着实时监控生产流程、自动识别产品缺陷的关键任务。这类智能体通过集成计算机视觉、深度学习与边缘计算技术,能够在毫秒级时间内完成对零部件表面划痕、裂纹、色差等微…

张小明 2025/12/30 16:31:03 网站建设

较好的网站建设公司转播网站如何做

教学视频还能这样生成?50亿参数小钢炮模型Wan2.2-T2V-5B实测来了 🎥✨ 你有没有遇到过这种情况:备课到深夜,想做个动画演示“光合作用”的过程,结果发现——要么找不到合适的资源,要么自己做视频太费时间&a…

张小明 2025/12/30 16:37:35 网站建设

网站布局建设pageadmin破解版

Performance-Fish模组深度解析:彻底释放《环世界》性能潜力 【免费下载链接】Performance-Fish Performance Mod for RimWorld 项目地址: https://gitcode.com/gh_mirrors/pe/Performance-Fish Performance-Fish作为《环世界》社区中备受推崇的性能优化模组&…

张小明 2025/12/30 16:26:09 网站建设

阿里云网站建设和部署框架大连住房和城乡建设网站

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

张小明 2025/12/30 16:27:43 网站建设