攀枝花 网站建设wordpress 谷歌登陆

web/2025/9/26 13:19:13/文章来源:
攀枝花 网站建设,wordpress 谷歌登陆,国外免费建站,搜索引擎优化大致包含哪些内容或环节以下举例皆针对单例模式讨论 图解参考 https://www.processon.com/view/link/60e3b0ae0e3e74200e2478ce 1、Spring 如何创建Bean#xff1f; 对于单例Bean来说#xff0c;在Spring容器整个生命周期内#xff0c;有且只有一个对象。 Spring 在创建 Bean 过程中#xff0…以下举例皆针对单例模式讨论 图解参考 https://www.processon.com/view/link/60e3b0ae0e3e74200e2478ce 1、Spring 如何创建Bean 对于单例Bean来说在Spring容器整个生命周期内有且只有一个对象。 Spring 在创建 Bean 过程中使用到了三级缓存即 DefaultSingletonBeanRegistry.java 中定义的 /** Cache of singleton objects: bean name to bean instance. */private final MapString, Object singletonObjects new ConcurrentHashMap(256); ​/** Cache of singleton factories: bean name to ObjectFactory. */private final MapString, ObjectFactory? singletonFactories new HashMap(16); ​/** Cache of early singleton objects: bean name to bean instance. */private final MapString, Object earlySingletonObjects new ConcurrentHashMap(16); 以 com.gyh.general 包下的 OneBean 为例debug springboot 启动过程分析spring是如何创建bean的。 参考图中 spring创建bean 的过程。其中最关键的几步有 1.getSingleton(beanName, true) 依次从一二三级缓存中查找bean对象如果缓存中存在对象则直接返回(early) 2.createBeanInstance(beanName, mbd, args) 选一个合适的构造函数new实例对象(instance)此时的instance中依赖的属性还都是null属于半成品 3.singletonFactories.put(beanName, oneSingletonFactory) 利用上一步的instance构建一个 singletonFactory并将其放到三级缓存中 4.populateBean(beanName, mbd, instanceWrapper) 填充bean为该bean定义的属性创建对象或赋值 5.initializeBean(one,oneInstance, mbd) 初始化bean对bean进行初始化或其他加工如生成代理对象(proxy) 6.getSingleton(beanName, false) 依次在一二级缓存中查找检查是否有因循环依赖导致提前生成的对象有的话与初始化后的对象是否一致 2、Spring 如何解决循环依赖 以 com.gyh.circular.threeCache 包下的 OneBean 和 TwoBean 为例 两个 Bean 相互依赖即形成闭环。 参考图中 spring解决循环依赖 的过程可知spring利用三级缓中的 objectFactory 生成并返回一个 early 对象提前暴露这个 early 地址供其他对象依赖注入使用以此解决循环依赖问题。 3、Spring 不能解决哪些循环依赖 3.1 循环中使用了 Async 注解 3.1.1 为什么循环中使用了 Async 会报错 以 com.gyh.circular.async 包下的 OneBean 和 TwoBean 为例两个bean相互依赖且oneBean中的方法使用了 Async 注解此时启动spring失败报错信息为org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name a.one: Bean with name a.one has been injected into other beans [a.two] in its raw version as part of a circular reference, but has eventually been wrapped. This means that said other beans do not use the final version of the bean. This is often the result of over-eager type matching - consider using getBeanNamesForType with the allowEagerInit flag turned off, for example. 并通过debug代码发现报错位置在 AbstractAutowireCapableBeanFactory#doCreateBean 方法内由于 earlySingletonReference ! null 且 exposedObject ! bean导致报错。 结合流程图中 spring解决循环依赖 及上述图片中可知 1.行1中 bean 为 createBeanInstance 创建的实例(address1) 2.行2中 exposedObject 为 initializeBean 后生成的代理对象(address2) 3.行3中 earlySingletonReference 为 getEarlyBeanReference 时创建的对象【此处地址同bean(address1)】 深层原因为先前 TwoBean 在 populateBean 时已经依赖了地址为 address1 的 earlySingletonReference 对象而此时 OneBean 经过 initializeBean 之后返回了地址为 address2 的新对象导致spring不知道哪个才是最终版的bean所以报错。 earlySingletonReference 是如何生成的参考getSingleton(“one”, true)过程。 3.1.2 循环中使用了 Async 一定会报错吗 依然以 com.gyh.circular.async 包下的 OneBean 和 TwoBean 为例两个bean相互依赖使 TwoBean(非OneBean)中的方法使用了 Async 注解此时启动spring成功并未报错。 debug代码可知虽然TwoBean 使用了 Async 注解但其 earlySingletonReference null; 故不会引起报错。 深层原因为OneBean 先被创建TwoBean 后创建再整条链路中并未在三级缓存中查找过 TwoBean 的 objectFactory 。OneBean在创建过程中被找过两次即 one- two -oneTwoBean 的创建过程中只找过它一次即 two -one。) 由此可得Async 造成循环依赖报错的先约条件为 1.循环依赖中的 Bean 使用了 Async 注解 2.且这个 Bean比循环内其他 Bean 先创建。 3.注一个Bean可能会同时存在于多个循环内只要存在它是某个循环内第一个被创建的Bean那么就会报错。 3.1.3 为什么循环中使用了 Transactional 不会报错 已知使用了 Transactional 注解的 BeanSpring 也会为其生成代理对象但为什么这种 Bean 在循环里时不会产生报错呢 以 com.gyh.circular.transactional 包下的 OneBean 和 TwoBean 为例两个 Bean 相互依赖且 OneBean 中的方法使用了 Transactional 注解启动Spring成功并不会报错。 debug 代码可知生成 OneBean 过程中虽然 earlySingletonReference ! null但 initializeBean 之后的 exposedObject 和 原始实例的地址相同即 initializeBean 步骤中并未对实例生成代理所以不会产生报错。 3.1.4 为什么同样是代理会产生两种不同的现象 同样是生成代理对象同样是参与到循环依赖中会产生不同现象的原因是当他们处在循环依赖中时生成代理的节点不同 1.Transactional 在 getEarlyBeanReference 时生成代理提前暴露出代理之后的地址即最终地址 2.Async 在 initializeBean 时生成代理导致提前暴露出去的地址不是最终地址造成报错。 为什么 Async 不能在 getEarlyBeanReference 时生成代理呢对比下两者执行的代码过程发现 两者都是在 AbstractAutoProxyCreator#getEarlyBeanReference 的方法对原始实例对象进行包装如下图 使用 Transactional 的Bean 在 create proxy 时获取到一个advice 随即生成了代理对象 proxy. 而使用 Async 的Bean 在 create proxy 时没有获取到 advice不能被代理. 3.1.5 为什么Async 在 getEarlyBeanReference 时不能返回一个 advice 在 AbstractAutoProxyCreator#getAdvicesAndAdvisorsForBean 方法内其主要做的事情有 1.找到当前 spring 容器中所有的 Advisor 2.返回适配当前 bean 的所有 Advisor 第一步返回的 Advisor 有 BeanFactoryCacheOperationSourceAdvisor 和 BeanFactoryTransactionAttributeSourceAdvisor并无处理 Async 相关的 Advisor. 刨根问底追查为什么第一步不会返回处理 Async 相关的 Advisor 已知使用 Async Transactional Cacheable 需要提前进行开启即提前标注 EnableAsync、EnableTransactionManagement、EnableCaching 。 以 EnableTransactionManagement、EnableCaching 为例在其注解定义中引入了Selector类Selector中又引入了Configuration 类在 Configuration 类中创建了对应 Advisor 并放到了 spring容器中所以第一步才能得到这两个 Advisor. 而 EnableAsync的定义中引入的 Configuration 类创建的是 AsyncAnnotationBeanPostProcessor 并非一个 Advisor所以第一步不会得到它所以 Async 的 bean 不会在这一步被代理。 3.2 构造函数引起的循环依赖 以 com.gyh.circular.constructor 包下的 OneBean 和 TwoBean 为例两个类的构造函数中各自依赖对方启动spring报错org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name c.one: Requested bean is currently in creation: Is there an unresolvable circular reference? debug 代码可知两个bean在根据构造函数 new instance 时就已经陷入的死循环无法提前暴露可用的地址所以只能报错。 4、如何解决以上循环依赖报错 1.不用 Async将需要异步操作的方法放到线程池中执行。推荐 2.提出 Async 标注的方法。推荐 3.将使用 Async 的方法提出到单独的类中该类只做异步处理不做其他业务依赖即避免形成循环依赖从而解决报错问题。参考 com.gyh.circular.async.extract 包。 4.尽量不使用构造函数依赖对象。推荐 5.破坏循环不推荐即不形成闭环在开发之前规划好对象依赖方法调用链尽量做到不使用循环依赖。较难随着迭代开发不断变化很可能产生循环 6.破坏创建顺序不推荐 7.由于使用 Async 注解的所在类比循环依赖内其他类先创建时才会报错那么想办法使该类不先于其他类先创建也可解决该问题如DependsOn、 Lazy 作者京东科技 郭艳红 来源京东云开发者社区

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/81525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站开发工具发展史简单网页模板代码

1. 以满分十分来评估自己——你有多擅长 Java? 如果你并不完全确信你自己或是你对 Java 的熟练程度,那么这会是一个非常棘手的问题。如果有这种情况,你应该把打分调低一点。之后,你大概会得到与你承认的水平相符的问题。因此&…

杭州建设银行网站首页开票 网站建设

文章目录 entryoutputloaderpluginmode前端构建基础配置关联HTML插件html-webpack-plugin构建 CSS 解析 ES6和React JSX解析 ES6解析 React JSX 解析CSS、Less和Sass解析CSS解析Less解析sass 解析图片和字体资源解析:解析图片资源解析:解析字体资源解析&…

贵港网站推广网站软文营销

第四章 常用web开发数据库框架 4.1.整合Spring JDBC操作数据 4.2 Spring JDBC多数据源的实现 4.3.Spring JDBC JTA实现分布式事务 4.4.ORM主流框架选型 4.5.bean转换Dozer的快速上手 4.6.整合Spring Data JPA操作数据 4.7.Sp…

网站开发搜索功能wordpress頂部公告插件

最近更新:29th 4月, 2013最近对bt比较感兴趣,看到不少朋友说,bt早都出10了11了我说我怎么就不知道。官方网站打开一看,果然还是BT5,不过已经r3了。听说现在BT5的支持已经很好了,于是也就下载了一个&#xf…

外贸网站模王烨小说主角

1.把Android源码导入Android Studio进行调试 源码下载完成后,先编译。 如下sample, projects不同编译命令不同 $ source build/envsetup.sh $ lunch aosp_flounder-userdebug $ make -j8 ( 8代表CPU核数 ) 编译idegen这个项目,生成idegen.jar文件.…

做网站公司信科建站免费企业做网站步骤

一、DI (依赖注入) 依赖注入(DI)是一种实现控制反转(IoC)的技术,可以在运行时动态地向应用程序提供其所需的依赖。在 Spring 框架中,DI 是一种常用的实践,有助于提高代码的模块化和灵活性。下面…

成都网站建设方案服务淘宝网pc首页

简述 Flask 是 Python 生态圈中一个基于 Python 的Web 框架。其轻量、模块化和易于扩展的特点导致其被广泛使用,适合快速开发 Web 应用以及构建小型到中型项目。它提供了开发 Web 应用最基础的工具和组件。之所以称为微框架,是因为它与一些大型 Web 框架…

外贸网站谷歌优化菏泽市建设局网站

盒子阴影 属性值为box-shadow,盒子阴影不占空间,不影响盒子之间的距离. 值说明h-shadow必需,水平阴影位置,允许为负值v-shadow必需,水平阴影位置,允许为负值blur可选,模糊距离,数值越大影子越模糊spread可选,影子的尺寸color可选,影子的颜色inset可选, 将外阴影改为内阴影(省…

企业网站建设北京网站需要服务器吗

漏洞描述 IP-guard是由溢信科技股份有限公司开发的一款终端安全管理软件,旨在帮助企业保护终端设备安全、数据安全、管理网络使用和简化IT系统管理。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危…

比分网站仿站建设科技布是什么面料

Feign的默认实现不支持连接池,换位Apache的HttpClient或者OKHttp连接池 引入依赖即可。 最佳实践 Feign的使用,一般抽取为单独的模块,引入依赖以及相关实体类,配置类等。在使用时引入接口依赖。 在引入依赖时,由于我…

网站设计与网站建设a卷东莞网站建设那家好

1 前言 如果你正在准备软件工程师或软件开发人员的面试,那么你可能知道由于其开放性质和广泛性,准备系统设计是多么困难,但同时你也不能忽略它。在软件工程界,如果你正在申请高级工程师/主管/架构师或更高级别的角色,系统设计是最受追捧的技能,也是整个过程中最重要的环节之一…

灵动网站建设企业类网站有哪些例子

A07_HttpRunner重定向_04_解决方案既然 HttpRunner 是对 requests 模块的封装,那我们就试图从 requests 中寻找答案,在其官网中发现了对重定向的描述和处理:地址:http://cn.python-requests.org/zh_CN/latest/user/quickstart.htm…

网站icp备案网址微动网站建设

本文讨论了领导者在沟通过程中如何避免成为传声筒,通过筛选、处理和总结信息,在向上、向下沟通时保持相关性和真实性,提高沟通效率和效果。原文: The Dumbest Mistake Leaders Make in Communication 中层管理者作为高层领导、下属团队和其他…

做家务的男人网站上海泵阀网站建设

近期转到研发岗,需要用到mysql、vs2008;之前由于没有做过,写下这篇文章记录下这周所学的东西!先安装好相关软件安装时间比较久耐心等待......安装完毕之后打开vs,Tools -> opptions ->设置完毕之后,点…

国外网站空间 月付购买网络商城系统

Uni-app 和 Vue 是两个不同的概念,它们之间的关系可以简单描述为: Vue: Vue.js 是一个流行的前端 JavaScript 框架,用于构建用户界面和单页面应用。Vue 具有简洁的语法、响应式数据绑定和组件化的特性,使得开发者可以更…

车险网站模版军事新闻最新消息中国南海今天

在Fragment中使用了騰訊的X5 webview,雖然好用,但是在Fragment中傳遞消息困難,想要返回上一頁,還得各種消息傳遞什么的,麻煩.可是在Fragment中又不能使用onKeyDown,那怎么辦了?哎,我是太菜了,也不想動腦子,那就在Fragment的最上面加了一個標題欄,里面放了一個textView標簽,監聽…

做高端品牌网站建设wordpress_域名输入后index of_然后点进取

那么,诚实签最关键的4个要点 是什么呢? 第一,证明你有一定的经济实力。 可能需要房产、存款等证明,也需要银行信用卡或借记卡半年流水证明(让人信服的每月进帐和消费能力)。 这些是为了证明,你可…

苏州相城区做网站公司苏州网站建设n苏州网站建设公司

1 Scilab简要介绍Scilab 是由法国国家信息、自动化研究院(INRIA)的科学家们开发的“开放源码”软件。Scilab是开源的软件,用户不仅可以在Scilab的许可证条件下自由使用该软件,还可以根据自己需要修改源代码,使之更加符合自身需要。与Matlab类…

中国建设银行官网站企业网银网页界面设计主要内容有哪些

在网络爬虫领域,动态渲染类型页面的数据提取和下载自动化是一个常见的挑战。本文将介绍如何利用Pyppeteer库完成这一任务,帮助您轻松地提取动态渲染页面中的数据表并实现下载自动化。 一、环境准备 首先,确保您已经安装了Python环境。接下来…

优秀品牌网站案例分析怎么给网站做推广

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 ICC2设置no 1x的方法如下: 1) set_placement_spacing_label -name X -lib_cells {*} -side right set_placement_spacing_label -name Y -lib_cells {*} -side left 2) set_placement_spacing_rul…