哪个网站可以做化学实验深圳外贸建设网站

张小明 2026/3/12 14:33:57
哪个网站可以做化学实验,深圳外贸建设网站,网站logo怎么做,合肥网站建设公司哪家好pring的循环依赖循环依赖是指在使用Spring框架的过程中#xff0c;两个或多个Bean之间在初始化的过程相互依赖#xff0c;形成一个依赖闭环#xff0c;导致容器无法顺利完成Bean的创建和注入#xff0c;从而可能引发启动失败或运行异常。Servicepublic class ServiceA {Aut…pring的循环依赖循环依赖是指在使用Spring框架的过程中两个或多个Bean之间在初始化的过程相互依赖形成一个依赖闭环导致容器无法顺利完成Bean的创建和注入从而可能引发启动失败或运行异常。Servicepublic class ServiceA {Autowiredprivate ServiceB serviceB;}Servicepublic class ServiceB {Autowiredprivate ServiceA serviceA;}在上面这段代码中类 ServiceA 的实例需要注入 ServiceB 的实例。类 ServiceB 的实例又需要注入 ServiceA 的实例。这就形成了一个 ServiceA → ServiceB → ServiceA 的循环依赖。当然大于两个的类也可能存在循环依赖例如A→ B→ C→ Aimageimage如何解决循环依赖在Spring中解决循环依赖也是有一定限制的。循环依赖的Bean都是单例模式的Bean。依赖注入的方式不能都是构造函数注入的方式。Spring解决循环依赖为什么只支持单例模式的Bean从本质上来说Spring解决循环依赖的方式是通过提前暴露未初始化完成的Bean来解决循环依赖的这个尚未初始化完成的Bean是个半成品的Bean就是未了解决循环依赖才提前放到缓存中的。在Spring容器中单例Bean的创建和初始化只会发生一次而且是在容器启动的时候就完成的。这就说明在整个容器运行期间单例Bean的依赖关系不会再发生变化因此可以在容器启动的时候通过提前暴露半成品的Bean来一次性解决单例Bean循环依赖的问题。image而由于原型模式property的Bean或Session模型下的Bean创建和初始化会发生多次并且是在Spring容器运行期间动态的发生变化因此提前暴露半成品的Bean并不能解决循环依赖的问题因为在后续的创建过程中可能会涉及到多个不同的原型Bean这就无法像单例Bean那样缓存并复用半成品对象。所以Spring只能自动解决单例Bean的循环依赖。Spring为什么不支持自动解决构造函数的循环依赖这个也很好理解因为在整个Bean的实例化的过程中是先执行构造函数只有执行了构造函数后才算是在堆内存中分配了内存后面再填充属性内存地址也不会有变化了。但是如果连构造函数都执行不成功那这个Bean就连个半成品都不算所以spring无法解决这种循环依赖。image解决这种构造函数的循环依赖有多种方式重新设计从代码层面就把循环依赖给杜绝掉彻底避免循环依赖。改成非构造函数依赖可以采用setter注入或属性注入使用Lazy注解解决使用Lazy注解时Spring容器会在实际需要该Bean的时候才会进行实例化而不是在容器启动的时候进行实例化。这样如果两个Bean存在循环依赖可以使用这种延迟实例化从而避免在容器启动时触发循环依赖但并未真正解决循环依赖本身。Spring三级缓存Spring三级缓存是什么在Spring框架中BeanFactory是IOC的基础接口其中DefaultSingletonBeanRegistry类实现了BeanFactory接口并维护了三个Map用来做Bean创建时的三级缓存。image这三级缓存的介绍一级缓存singletonObjects 单例缓存类型ConcurrentHashMapString, Object作用存放完全初始化完成的单例Bean实例。说明这是最终的单例池所有已经创建并装配好的Bean都会放在这里供后续直接获取使用。二级缓存earlySingletonObjects类型ConcurrentHashMapString, Object作用存放早期暴露的Bean实例原始对象尚未完成属性注入和初始化半成品。当一个Bean正在创建中但还未完成所有初始化步骤时可以提前暴露一个“半成品”对象放入此缓存供其他Bean引用从而打破循环依赖。三级缓存singletonFactories类型ConcurrentHashMapString, ObjectFactory?作用存放能够创建早期Bean实例的工厂对象ObjectFactory。它并不直接存储Bean实例而是存储一个lambda或匿名内部类用于在需要时生成早期暴露的对象。这允许Spring在暴露早期对象的同时还能应用一些后置处理器如AOP代理。Spring三级缓存是怎么解决循环依赖的步骤一创建Bean-ASpring 启动创建 Bean-A 的流程。在实例化instantiateBean之后属性注入populateBean之前Spring 会将一个 ObjectFactory工厂放入 三级缓存 (singletonFactories)。这个 ObjectFactory 的作用是当被调用时可以返回 Bean-A 的一个早期引用通常是原始对象或者如果需要AOP则是一个代理对象。步骤二创建 Bean-A 的依赖 (Bean-B)Spring 开始为 Bean-A 注入属性发现需要 Bean-B。检查一级缓存 (singletonObjects)没有找到 Bean-B。检查二级缓存 (earlySingletonObjects)也没有。检查三级缓存 (singletonFactories)同样没有 Bean-B。因此Spring 开始创建 Bean-B。步骤三开始创建 Bean-BBean-B 被实例化。同样地Spring 将一个用于创建 Bean-B 早期引用的 ObjectFactory 放入 三级缓存。步骤四创建 Bean-B 的依赖 (Bean-A)Spring 开始为 Bean-B 注入属性发现需要 Bean-A。检查一级缓存没有完整的 Bean-A。检查二级缓存没有。检查三级缓存发现存在 Bean-A 的 ObjectFactorySpring 调用这个 ObjectFactory.getObject() 方法。ObjectFactory 执行其逻辑通常会调用 getEarlyBeanReference()返回 Bean-A 的一个早期引用。这个早期引用被放入 二级缓存 (earlySingletonObjects)同时从三级缓存中移除对应的工厂。Spring 将这个早期引用的 Bean-A 注入到 Bean-B 中。步骤五完成 Bean-B 的创建Bean-B 完成属性注入和初始化。完全初始化好的 Bean-B 被放入 一级缓存 (singletonObjects)。从二级缓存中移除 Bean-B 的早期引用。步骤六回到 Bean-A 的创建现在 Bean-B 已经创建完毕并放入一级缓存。Spring 继续为 Bean-A 注入属性需要 Bean-B。直接从 一级缓存 中获取到完整的 Bean-B注入到 Bean-A 中。Bean-A 完成后续的初始化流程。完全初始化好的 Bean-A 被放入 一级缓存 (singletonObjects)。此时Bean-A 和 Bean-B 都已创建完毕循环依赖成功解决。解决循环依赖一定要三级缓存吗其实理论上一级加二级缓存就可以解决简单场景的单例Bean的循环依赖但是三级缓存的设计还涉及到更丰富场景的支持例如支持AOP动态代理的代理对象的提前暴露。如果只有二级缓存在 Bean-A 实例化后直接将其原始对象放入二级缓存。当 Bean-B 需要时直接从二级缓存拿到原始的 Bean-A。如果 Bean-A 需要被 AOP 代理例如添加事务那么最终放入一级缓存的应该是 代理对象而不是原始对象。但如果二级缓存里已经存了原始对象那么 Bean-B 拿到的就是原始对象这就导致了 不一致性Bean-B 持有的是原始对象而其他地方一级缓存持有的是代理对象。即便没有 AOP三级缓存的设计也有其必要性。它通过 ObjectFactory 延迟暴露早期引用确保 Spring 可以在需要时介入生成代理或执行后置处理器而不仅仅是直接返回原始对象。Spring默认支持循环依赖吗这个是看具体版本而言的在SpringBoot2.6之前是默认支持循环依赖的但是从Spring Boot 仍支持循环依赖但变为可配置项且默认关闭也就是说从SpringBoot2.6以后是默认不支持循环依赖的如果启动时存在循环依赖这个配置未打开是会报错的。虽然默认不再支持循环依赖但是我们可以通过以下方式开启对循环依赖的支持。在配置文件中加入此配置spring.main.allow-circular-referencestrue用Lazy注解在Autoired地方增加即可。Spring 团队已明确表示 未来可能彻底移除循环依赖支持建议开发者避免依赖此机制Spring和SpringBoot的区别Spring 和 SpringBoot 是 Java 生态中非常重要的两个框架它们密切相关但定位和目标不同。简单来说Spring 是一个功能强大的基础框架而 SpringBoot 是建立在 Spring 之上的“脚手架”工具旨在简化 Spring 应用的开发和部署。以下几点是SpringBoot在Spring的基础上做的最主要的几点来提升开发效率与降低开发成本自动配置SpringBoot通过Auto-Configuration来减少开发人员的配置工作。可以通过引入一个 starter 一次性引入所需的所有依赖使开发人员可以更专注于业务逻辑而不是配置。内嵌Web服务器SpringBoot内置了常见的Web服务器(如Tomcat、Jetty)这意味着您可以轻松创建可运行的独立应用程序而无需外部Web服务器。约定大于配置SpringBoot中有很多约定大于配置的思想的体现通过一种约定的方式来降低开发人员的配置工作。如他默认读取spring.factories来加载starter、读取application.properties或application.yml文件来进行属性配置等。更详细的区别特性 Spring SpringBoot核心定位 一个全面的、基础的 Java 框架提供企业级应用开发的核心功能如依赖注入、面向切面编程 Spring 框架的扩展专注于简化 Spring 应用的开发和配置实现开箱即用配置方式 需要大量手动配置XML 或 Java 配置类例如- 配置数据源- 配置 MVC 分发器- 配置事务管理 通过自动配置Auto-Configuration机制根据 classpath 中的依赖自动配置应用只需少量配置如 application.properties依赖管理 需要手动管理所有 Spring 模块如 spring-core, spring-webmvc和其他第三方库的版本容易出现版本冲突 通过起步依赖Starter Dependencies简化依赖管理- 例如 spring-boot-starter-web 自动引入 Spring MVC、Tomcat 等所有必要依赖- Spring Boot 的父 POM 管理了所有依赖版本确保兼容性内嵌服务器 传统 Spring 应用需要将应用打包成 WAR 文件部署到外部 Servlet 容器如 Tomcat、Jetty 内置了 Tomcat、Jetty 或 Undertow 等 Web 服务器应用可打包成可执行 JAR 文件通过 java -jar 直接运行开发效率 需要大量基础配置工作初始搭建速度较慢 极大提高开发效率开发者可以专注于业务逻辑无需关注基础配置监控与管理 需要自行集成健康检查、指标收集等功能 通过 Spring Boot Actuator 提供开箱即用的生产级监控功能- 健康检查health- 指标收集metrics- 外部化配置configprops- 环境信息env适用场景 适合需要高度定制化、复杂配置的大型企业级应用 适合快速开发微服务、RESTful API、需要快速迭代的中小型项目是构建现代云原生应用的首选
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站备案类型迅当网络深圳外贸网站建设

手机号查QQ号终极指南:3步快速找回关联账号 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 你是否曾经因为忘记QQ号而无法登录?或者需要确认某个手机号是否绑定过QQ账号?现在,通过phon…

张小明 2026/3/5 4:28:14 网站建设

影视公司网站模板模板网站 建设教材

文件与打印机共享管理全攻略 1. 文件共享与管理 在文件共享方面,我们可以通过特定方式将驱动器映射到共享文件夹内的子文件夹。具体操作是,通过浏览子文件夹或使用格式 \\<PC_name>\<folder_name>\<subfolder>\<subfolder> 指定文件夹名称。这样…

张小明 2026/3/5 4:28:15 网站建设

深圳网站建设哪个好如何给自己的网站做优化

Perl在CGI脚本与文件目录管理中的应用 在Web开发和文件管理领域,Perl语言展现出了强大的功能和灵活性。下面我们将详细探讨Perl在CGI脚本编写以及文件和目录管理方面的具体应用。 1. 使用Perl编写CGI脚本 在Web开发中,CGI(Common Gateway Interface)脚本起着重要作用,它…

张小明 2026/3/5 4:28:14 网站建设

寻找合肥网站建设推广策略有哪些方法

安装Linux - Mandrake系统全攻略 1. 安装前的准备 在安装Linux - Mandrake之前,需要完成一些准备工作,主要包括制作安装启动盘和准备硬盘。 1.1 定位启动盘 若计算机能从CD - ROM启动,CD上的Linux - Mandrake安装程序可自启动;若不能,则需要安装启动盘。该启动盘为3.5…

张小明 2026/3/5 4:28:15 网站建设

甘肃省安装建设集团公司网站win7dw做asp购物网站

测试环境管理是研发效能的“隐形战场”&#xff0c;管理不善会导致30%以上的研发时间浪费在环境问题上。以下是本人从一线实战中总结的完整管理体系。一、环境管理的核心痛点与成本1.1 四大核心痛点环境冲突:- 现象: 多团队共用环境&#xff0c;部署互相覆盖- 后果: 测试中断&a…

张小明 2026/3/5 4:28:16 网站建设

网站上的美工图片要怎么做给别人做网站挣钱

你是否还在为管理MySQL、PostgreSQL、Oracle等多种数据库而烦恼&#xff1f;是否觉得每个数据库都需要不同的客户端工具太过麻烦&#xff1f;DBeaver作为一款开源的多平台数据库管理工具&#xff0c;通过统一的界面和强大的功能&#xff0c;让你轻松应对各种数据库操作需求。本…

张小明 2026/3/5 4:28:19 网站建设