计算机网站建设招聘贵州城市和城乡建设官方网站

web/2025/10/5 6:06:30/文章来源:
计算机网站建设招聘,贵州城市和城乡建设官方网站,网站建设新手教程视频,如何自学广告设计BeanPostProcessors是Spring框架中的一个扩展机制#xff0c;它允许开发人员在Spring容器实例化、配置和初始化Bean的过程中干预和定制化。BeanPostProcessor接口定义了两个方法#xff1a;postProcessBeforeInitialization和postProcessAfterInitialization#xff0c;分别…BeanPostProcessors是Spring框架中的一个扩展机制它允许开发人员在Spring容器实例化、配置和初始化Bean的过程中干预和定制化。BeanPostProcessor接口定义了两个方法postProcessBeforeInitialization和postProcessAfterInitialization分别在Bean初始化之前和之后被调用。 BeanPostProcessors的作用是在Bean的初始化过程中提供额外的处理逻辑。通过实现BeanPostProcessor接口并注册到Spring容器中开发人员可以在Bean实例化后的早期和后期阶段对Bean进行修改、增强或执行其他自定义逻辑。这样可以实现很多功能如属性注入、AOP代理、资源初始化等。 猜测 入口是在AbstractApplicationContext的refresh方法中在方法中调用了registerBeanPostProcessors(beanFactory)从字面意思来说就是注册BeanPostProcessorsBeanPostProcessor具体做什么用的上面也有介绍本章就分析一下这个注册做了哪些事情。 分析 老规矩从入口的注释开始这个方法就是实例化和注册所有的BeanPostProcessor尊重期望的排序如果有给出的话这个方法必须在我们应用bean实力化之前被调用。 /*** Instantiate and register all BeanPostProcessor beans,* respecting explicit order if given.* pMust be called before any instantiation of application beans.*/ protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this); }方法实际调用的是PostProcessorRegistrationDelegate类中的registerBeanPostProcessors方法如果调用参数的详细入下截图所示 PostProcessorRegistrationDelegate 这个类中的方法其实就是整个代码的核心接下来我们继续用拆解的方式来进行分析下面是其所有的代码块。 public static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {// WARNING: Although it may appear that the body of this method can be easily// refactored to avoid the use of multiple loops and multiple lists, the use// of multiple lists and multiple passes over the names of processors is// intentional. We must ensure that we honor the contracts for PriorityOrdered// and Ordered processors. Specifically, we must NOT cause processors to be// instantiated (via getBean() invocations) or registered in the ApplicationContext// in the wrong order.//// Before submitting a pull request (PR) to change this method, please review the// list of all declined PRs involving changes to PostProcessorRegistrationDelegate// to ensure that your proposal does not result in a breaking change:// https://github.com/spring-projects/spring-framework/issues?qPostProcessorRegistrationDelegateis%3Aclosedlabel%3A%22status%3Adeclined%22String[] postProcessorNames beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);// Register BeanPostProcessorChecker that logs an info message when// a bean is created during BeanPostProcessor instantiation, i.e. when// a bean is not eligible for getting processed by all BeanPostProcessors.int beanProcessorTargetCount beanFactory.getBeanPostProcessorCount() 1 postProcessorNames.length;beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));// Separate between BeanPostProcessors that implement PriorityOrdered,// Ordered, and the rest.ListBeanPostProcessor priorityOrderedPostProcessors new ArrayList();ListBeanPostProcessor internalPostProcessors new ArrayList();ListString orderedPostProcessorNames new ArrayList();ListString nonOrderedPostProcessorNames new ArrayList();for (String ppName : postProcessorNames) {if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {BeanPostProcessor pp beanFactory.getBean(ppName, BeanPostProcessor.class);priorityOrderedPostProcessors.add(pp);if (pp instanceof MergedBeanDefinitionPostProcessor) {internalPostProcessors.add(pp);}}else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {orderedPostProcessorNames.add(ppName);}else {nonOrderedPostProcessorNames.add(ppName);}}// First, register the BeanPostProcessors that implement PriorityOrdered.sortPostProcessors(priorityOrderedPostProcessors, beanFactory);registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);// Next, register the BeanPostProcessors that implement Ordered.ListBeanPostProcessor orderedPostProcessors new ArrayList(orderedPostProcessorNames.size());for (String ppName : orderedPostProcessorNames) {BeanPostProcessor pp beanFactory.getBean(ppName, BeanPostProcessor.class);orderedPostProcessors.add(pp);if (pp instanceof MergedBeanDefinitionPostProcessor) {internalPostProcessors.add(pp);}}sortPostProcessors(orderedPostProcessors, beanFactory);registerBeanPostProcessors(beanFactory, orderedPostProcessors);// Now, register all regular BeanPostProcessors.ListBeanPostProcessor nonOrderedPostProcessors new ArrayList(nonOrderedPostProcessorNames.size());for (String ppName : nonOrderedPostProcessorNames) {BeanPostProcessor pp beanFactory.getBean(ppName, BeanPostProcessor.class);nonOrderedPostProcessors.add(pp);if (pp instanceof MergedBeanDefinitionPostProcessor) {internalPostProcessors.add(pp);}}registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);// Finally, re-register all internal BeanPostProcessors.sortPostProcessors(internalPostProcessors, beanFactory);registerBeanPostProcessors(beanFactory, internalPostProcessors);// Re-register post-processor for detecting inner beans as ApplicationListeners,// moving it to the end of the processor chain (for picking up proxies etc).beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext)); }步骤一 直接通过类型去获取所有的BeanPostProcessor的BeanNames存在postProcessorNames数组中。 String[] postProcessorNames beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);步骤二 注册一个名为BeanPostProcessorChecker的BeanPostProcessor并将其添加到beanFactory中。 具体分析如下 获取已注册的BeanPostProcessor数量 int beanProcessorTargetCount beanFactory.getBeanPostProcessorCount();这行代码获取已经注册到beanFactory的BeanPostProcessor的数量。 计算新的BeanPostProcessor的目标数量 beanProcessorTargetCount beanProcessorTargetCount 1 postProcessorNames.length;在已有的BeanPostProcessor数量基础上加上1表示新注册的BeanPostProcessorChecker以及postProcessorNames的长度表示后续要注册的BeanPostProcessor的数量计算出新的目标数量。 创建并注册BeanPostProcessorChecker beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));创建一个名为BeanPostProcessorChecker的BeanPostProcessor实例并将其添加到beanFactory中。BeanPostProcessorChecker是一个自定义的BeanPostProcessor它在BeanPostProcessor实例化期间检查并记录信息。具体来说当创建BeanPostProcessor期间创建了一个Bean即一个Bean不符合所有BeanPostProcessor的处理条件时BeanPostProcessorChecker会记录一个信息日志。 步骤三 对已注册的BeanPostProcessor进行分类并按照优先级顺序注册到beanFactory中。 创建用于存储实现PriorityOrdered接口的BeanPostProcessor的列表 ListBeanPostProcessor priorityOrderedPostProcessors new ArrayList();创建一个名为priorityOrderedPostProcessors的列表用于存储实现了PriorityOrdered接口的BeanPostProcessor。 创建用于存储内部BeanPostProcessor的列表 ListBeanPostProcessor internalPostProcessors new ArrayList();创建一个名为internalPostProcessors的列表用于存储内部的BeanPostProcessor。 创建用于存储实现Ordered接口的BeanPostProcessor名称的列表 ListString orderedPostProcessorNames new ArrayList();创建一个名为orderedPostProcessorNames的列表用于存储实现了Ordered接口的BeanPostProcessor的名称。 创建用于存储未实现Ordered接口的BeanPostProcessor名称的列表 ListString nonOrderedPostProcessorNames new ArrayList();创建一个名为nonOrderedPostProcessorNames的列表用于存储未实现Ordered接口的BeanPostProcessor的名称。 遍历已注册的BeanPostProcessor名称列表根据其类型进行分类 for (String ppName : postProcessorNames) {if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {// BeanPostProcessor实现了PriorityOrdered接口BeanPostProcessor pp beanFactory.getBean(ppName, BeanPostProcessor.class);priorityOrderedPostProcessors.add(pp);if (pp instanceof MergedBeanDefinitionPostProcessor) {// 内部的BeanPostProcessorinternalPostProcessors.add(pp);}}else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {// BeanPostProcessor实现了Ordered接口orderedPostProcessorNames.add(ppName);}else {// 未实现Ordered接口的BeanPostProcessornonOrderedPostProcessorNames.add(ppName);} }遍历已注册的BeanPostProcessor名称列表postProcessorNames根据名称对应的BeanPostProcessor的类型进行分类。如果BeanPostProcessor实现了PriorityOrdered接口则将其添加到priorityOrderedPostProcessors列表中如果是MergedBeanDefinitionPostProcessor的实例则也添加到internalPostProcessors列表中如果实现了Ordered接口则将其名称添加到orderedPostProcessorNames列表中否则将其名称添加到nonOrderedPostProcessorNames列表中。 对实现PriorityOrdered接口的BeanPostProcessor进行排序 sortPostProcessors(priorityOrderedPostProcessors, beanFactory);调用sortPostProcessors方法对priorityOrderedPostProcessors列表中的BeanPostProcessor进行排序按照优先级顺序进行排序。 注册实现PriorityOrdered接口的BeanPostProcessor到beanFactory中 registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);调用registerBeanPostProcessors方法将priorityOrderedPostProcessors列表中的BeanPostProcessor注册到beanFactory中。 步骤四 实现了Ordered接口的BeanPostProcessor到beanFactory中。 创建用于存储实现Ordered接口的BeanPostProcessor的列表 ListBeanPostProcessor orderedPostProcessors new ArrayList(orderedPostProcessorNames.size());创建一个名为orderedPostProcessors的列表用于存储实现了Ordered接口的BeanPostProcessor。 遍历实现了Ordered接口的BeanPostProcessor的名称列表并将它们实例化并添加到orderedPostProcessors列表中 for (String ppName : orderedPostProcessorNames) {BeanPostProcessor pp beanFactory.getBean(ppName, BeanPostProcessor.class);orderedPostProcessors.add(pp);if (pp instanceof MergedBeanDefinitionPostProcessor) {// 内部的BeanPostProcessorinternalPostProcessors.add(pp);} }遍历实现了Ordered接口的BeanPostProcessor的名称列表orderedPostProcessorNames通过beanFactory.getBean方法实例化每个BeanPostProcessor并将其添加到orderedPostProcessors列表中。如果BeanPostProcessor是MergedBeanDefinitionPostProcessor的实例则也添加到internalPostProcessors列表中。 对实现Ordered接口的BeanPostProcessor进行排序 sortPostProcessors(orderedPostProcessors, beanFactory);调用sortPostProcessors方法对orderedPostProcessors列表中的BeanPostProcessor进行排序按照Ordered接口的顺序进行排序。 注册实现Ordered接口的BeanPostProcessor到beanFactory中 registerBeanPostProcessors(beanFactory, orderedPostProcessors);调用registerBeanPostProcessors方法将orderedPostProcessors列表中的BeanPostProcessor注册到beanFactory中。 步骤五 注册剩余的未实现Ordered接口的BeanPostProcessor并重新注册内部的BeanPostProcessor。 创建用于存储未实现Ordered接口的BeanPostProcessor的列表 ListBeanPostProcessor nonOrderedPostProcessors new ArrayList(nonOrderedPostProcessorNames.size());创建一个名为nonOrderedPostProcessors的列表用于存储未实现Ordered接口的BeanPostProcessor。 遍历未实现Ordered接口的BeanPostProcessor的名称列表并将它们实例化并添加到nonOrderedPostProcessors列表中 for (String ppName : nonOrderedPostProcessorNames) {BeanPostProcessor pp beanFactory.getBean(ppName, BeanPostProcessor.class);nonOrderedPostProcessors.add(pp);if (pp instanceof MergedBeanDefinitionPostProcessor) {// 内部的BeanPostProcessorinternalPostProcessors.add(pp);} }遍历未实现Ordered接口的BeanPostProcessor的名称列表nonOrderedPostProcessorNames通过beanFactory.getBean方法实例化每个BeanPostProcessor并将其添加到nonOrderedPostProcessors列表中。如果BeanPostProcessor是MergedBeanDefinitionPostProcessor的实例则也添加到internalPostProcessors列表中。 注册未实现Ordered接口的BeanPostProcessor到beanFactory中 registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);调用registerBeanPostProcessors方法将nonOrderedPostProcessors列表中的BeanPostProcessor注册到beanFactory中。 对内部的BeanPostProcessor进行排序 sortPostProcessors(internalPostProcessors, beanFactory);调用sortPostProcessors方法对internalPostProcessors列表中的BeanPostProcessor进行排序。 重新注册内部的BeanPostProcessor到beanFactory中 registerBeanPostProcessors(beanFactory, internalPostProcessors);调用registerBeanPostProcessors方法将internalPostProcessors列表中的BeanPostProcessor重新注册到beanFactory中。 重新注册用于检测内部Bean作为ApplicationListeners的后处理器 beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));创建一个ApplicationListenerDetector的实例并将其作为BeanPostProcessor添加到beanFactory中。这个后处理器用于检测内部Bean是否为ApplicationListeners并将其移动到处理器链的末尾以便在处理代理等情况时能够正确拾取内部Bean。

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

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

相关文章

江西建设质量安全监督网站杭州品牌网站

字幕组双语原文:如何使用RetinaNet模型构建面罩检测器英语原文:How to build a Face Mask Detector using RetinaNet Model!翻译:雷锋字幕组(李珺毅)介绍目标检测是计算机视觉中一个非常重要的领域,对于自动…

西安网站建设价格上海注册公司费用及流程

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 和v3s一样,f1c200s本身也支持spi-nor flash。当然,不管是norflash,还是nandflash,都是为了能够让程序脱离sd卡,直接依靠板子上面的flash,就可以完成正常地加载和运行工作。tf…

政务微网站建设方案对网站建设展望

1、滚动到一定区域,顶部内容置换并置顶 功能: 当我向下滚动时,当关注那一行快到顶部的时候,把左侧区域的内容切换成右侧区域的内容,并置顶 原先我使用v-if来显示隐藏,发现会出现闪屏的现象,后来…

重庆网站网站建设沈阳网站建设模块

Shell用户与系统内核之间交流平台Shell类型/bin/sh/bin/bash(系统默认bash)/bin/tcsh/bin/csh/etc/shells 放置当前系统可用shell为什么需要shell编程1.减少繁琐工作的重复进行,减少错误2.提高工作效率3.事态的批量化进行Bash特点功能1.查看命令历史(1000条)history…

地方社区网站 备案制作网站中英文字体不能为

一.如何理解递归 递归对于初学者来说是一个非常抽象的概念,笔者在第一次学习时也是迷迷糊糊的(二叉树遍历),递归的代码看起来非常的简洁,优美,但是如何想出来递归的思路或者为什么能用递归这是初学者很难分析出来的 笔者在学习的过程中通过刷题,也总结出自己的一些经验,总结来…

民网东莞网站建设建设平台网站协议

目录 Pod 中 init 容器 1 init 容器特点 2 使用 init 容器 Pod 中 init 容器 Init 容器是一种特殊容器,在Pod 内的应用容器启动之前运行。Init 容器可以包括一些应用镜像中不存在的实用工具和安装脚本。 1 init 容器特点 init 容器与普通的容器非常像&#xf…

网站建设费如何入账国内网页设计欣赏

一、github登不上去问题 下载watt toolkit 下载地址:https://steampp.net/ 可以下载后加速,访问github 二、猫狗总体参考核心 B哥的博客 https://github.com/bubbliiiing/classification-keras?tabreadme-ov-file 三、CSDN很多会员才能阅读问题 根据…

jquery网站后台模板福州网站建设市场

Pyecharts 是一个用于生成各种交互式图表的 Python 图表库。它是基于开源的 Echarts 图表库构建的,Echarts 是由百度团队开发的一个使用 JavaScript 实现的开源可视化库。Pyecharts 使得在 Python 中创建复杂的图表变得更加容易,它支持多种类型的图表&am…

站内推广方案wordpress 页面上显示文章

在探讨自闭症儿童的教育与康复之路时,星贝育园无疑是一个值得深入了解的典范。这所全国知名的广泛性发育障碍全托寄宿制儿童康复训练机构,不仅以其独特的CBM干预法引领着行业前沿,更以其对每一个孩子的深切关怀与承诺,构建了一个充…

网站建设蓝图ppt全国网站建设人员数量

在软件开发过程中,项目的构建是一个不可避免的环节。而随着项目规模的增大,手动管理编译过程变得越来越繁琐。为了简化构建流程并实现跨平台支持,CMake作为一种流行的构建系统被广泛采用。本文将介绍CMakeLists.txt文件的结构,以及…

网站设计的规范wordpress更新服务

1、软件测试计划简介 测试计划,一般是主管写,在需求分析之后,测试工作开始之间做的一些准备划工作。一般包含以下内容:5W1H 目的、测试范围、测试进度安排、测试人员、测试环境、测试方法工具,风险评估 (w…

宣传部网站建设策划书做pc端网站什么开头

链表结构 说到链表结构就不得不提起数据结构,什么是数据结构?就是用来组织和存储数据的某种结构。那么到底是某种结构呢? 数据结构分为: 线性结构 数组,链表,栈,队列 树形结构 二叉树&#x…

如何更改网站备案号营商环境网站建设

[vue] 你有使用过vue开发多语言项目吗?说说你的做法? 使用Vue-i18n 加载不同的语言配置文件, 重要是初始化时,判断当前语言环境,要想好存储方案 采用i18n来解决国际化问题,关于语言环境的存储方案,看到有…

网站建设毕业答辩ppt模板网页制作作品欣赏

在Data Geekery ,我们喜欢Java。 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 Java 8星期五 每个星期五,我们都会向您展示一些不错的教程风格的Java 8新功能&#…

平台营销型网站有什么设计网站推荐

Flume(1.11.0版本) 简介 概述 Flume本身是由Cloudera公司开发的后来贡献给了Apache的一套针对日志数据进行收集(collecting)、汇聚(aggregating)和传输(moving)的机制 Flume本身提供了简单且灵活的结构来完成日志数据的传输 Flume有两大版本&#x…

网站项目需求分析广州黄埔区做网站培训机构

MNN是一个高效、轻量的深度学习框架,它支持深度模型的推理与训练,尤其在端侧的推理与训练性能在业界处于领先地位。MNN已经在阿里巴巴的多个App中使用,覆盖多个场景,同时在IoT等场景下也有若干应用。它支持TensorFlow、Caffe、ONN…

鼠标放到一级导航时才显示网站二级导航 鼠标离开时不显示 怎么控制360浏览器怎么创建网页

FOFA网络空间搜索引擎使用教程 FOFA是白帽汇推出的一款网络空间搜索引擎,它通过进行网络空间测绘,能够帮助研究人员或者企业迅速进行网络资产匹配,例如进行漏洞影响范围分析、应用分布统计、应用流行度排名统计等。 官网:https:…

杭州pc手机网站建设wordpress优秀中文主题

获取需要的 RPM 包常用站点: http://mirrors.sohu.com http://rpmfind.net http://rpm.pbone.net/

网站后台功能开发免费素材库网站

一、接下来,我们来说这个“图形上下文栈” 1.我们还是把之前的copy这份儿代码复制一下,改个名字,叫做“02-图形上下文栈”, 好,我们把刚才那个圆形拿过来,那条线也拿过来,用CGContextAdd:这种方式, 把第一步,获取当前上下文,也拿过来,第三步,渲染,也拿过来, 打开…

莱州网站建设服务wordpress源码商城

最近换手机的时候一时冲动败了个32G的TF卡。买后又觉得手机存储空间还比较充裕,暂时用不上,便打算套个读卡器当U盘用。最开始我用的是以前买手机的时候送的一个读卡器,但其兼容性很差,在以前的那个8G的卡里还能勉强用用&#xff0…