电子商务公司网站设计wordpress标签归档

news/2025/10/5 8:42:32/文章来源:
电子商务公司网站设计,wordpress标签归档,搜索网站的设计与建设,wordpress商城自动发货BeanFactoryPostProcessor和BeanPostProcessor这两个接口都是初始化bean时对外暴露的入口之一#xff0c;和Aware类似#xff08;PS:关于spring的hook可以看看Spring钩子方法和钩子接口的使用详解讲的蛮详细#xff09;本文也主要是学习具体的钩子的细节#xff0c;以便于实…BeanFactoryPostProcessor和BeanPostProcessor这两个接口都是初始化bean时对外暴露的入口之一和Aware类似PS:关于spring的hook可以看看Spring钩子方法和钩子接口的使用详解讲的蛮详细本文也主要是学习具体的钩子的细节以便于实际开发中我们能有效率例如如何在scala中如何获取springboot的启动类等等一些中间件为了监控整个系统的服务也需要获取到spring容器数据和状态。 接下来具体学习和了解下BeanFactoryPostProcessor和BeanPostProcessor。 BeanFactoryPostProcessor bean工厂的bean属性处理容器说通俗一些就是可以管理我们的bean工厂内所有的beandefinition未实例化数据可以随心所欲的修改属性。 使用方法 public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {/*** 主要是用来自定义修改持有的bean* ConfigurableListableBeanFactory 其实就是DefaultListableBeanDefinition对象* param beanFactory* throws BeansException*/public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {System.out.println(调用了自定义的BeanFactoryPostProcessor beanFactory);Iterator it beanFactory.getBeanNamesIterator();String[] names beanFactory.getBeanDefinitionNames();// 获取了所有的bean名称列表for(int i0; inames.length; i){String name names[i];BeanDefinition bd beanFactory.getBeanDefinition(name);System.out.println(name bean properties: bd.getPropertyValues().toString());// 本内容只是个demo打印持有的bean的属性情况}} }context:property-placeholder locationpro.properties / bean idstudent classStudent init-methodinit / bean classCustomBeanFactoryPostProcessor idcustomBeanFactoryPostProcessor /输出结果 源码分析 毫无疑问肯定已经解析xml了继续看refresh函数 AbstractApplicationContext 文件 public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {// Prepare this context for refreshing.prepareRefresh();// 解析xml完成存储在一个具体的bean工厂中ConfigurableListableBeanFactory beanFactory obtainFreshBeanFactory();// bean工厂的初始化操作prepareBeanFactory(beanFactory);try {// 由子类继承去实现该类当前该方法为空postProcessBeanFactory(beanFactory);// invoke 其中存在的BeanFactoryPostProcessors,也就是我们现在说的invokeBeanFactoryPostProcessors(beanFactory);... PostProcessorRegistrationDelegate 文件 invokeBeanFactoryPostProcessors方法的参数为bean工厂ConfigurableListableBeanFactory和当前已知的postprocessor对象函数分为了好几部分去处理截取其中我们关心的部分即可其实还包含了优先级、属性等类似处理过程 String[] postProcessorNames beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);// 筛选出bean工程中存在的所有实现BeanFactoryPostProcessor类的类名称ListBeanFactoryPostProcessor priorityOrderedPostProcessors new ArrayListBeanFactoryPostProcessor();ListString orderedPostProcessorNames new ArrayListString();ListString nonOrderedPostProcessorNames new ArrayListString();for (String ppName : postProcessorNames) {if (processedBeans.contains(ppName)) {// 已经存在了不再处理}else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));// 为PriorityOrdered类型}else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {orderedPostProcessorNames.add(ppName);// 为Ordered类型}else {nonOrderedPostProcessorNames.add(ppName);// 这个就是我们当前需要关心的PostProcessors}}...ListBeanFactoryPostProcessor nonOrderedPostProcessors new ArrayListBeanFactoryPostProcessor();for (String postProcessorName : nonOrderedPostProcessorNames) {nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));// 获取自定义的BeanFactoryPostProcessor// 这里有一点需要注意到}invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);上述代码中nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));中使用了getBean起初没注意到以为是生成具体的对象然后修改其实不是getBean后面还有一个参数BeanFactoryPostProcessor.class注意看这个函数会发现返回的是一个抽象类结论就是nonOrderedPostProcessors添加的不是bean实例而是beandefinition在实例化前这点很重要 private static void invokeBeanFactoryPostProcessors(Collection? extends BeanFactoryPostProcessor postProcessors, ConfigurableListableBeanFactory beanFactory) {for (BeanFactoryPostProcessor postProcessor : postProcessors) {postProcessor.postProcessBeanFactory(beanFactory);// 调用每一个自定义的BeanFactoryPostProcessor的方法// 在本文章中就会去调用自定义的CustomBeanFactoryPostProcessor的postProcessBeanFactory方法} }再多说一点关于上面的getBeanNamesForType函数从名字肯定很容易理解了根据传递的类型获取容器中的beanName。了解下其内部的实现原理 DefaultListableBeanFactory 文件的 getBeanNamesForType函数 // type:类的类型名称 // includeNonSingletons:返回数据包含了非单例beanName // allowEagerInit: 可以提前加载初始化 public String[] getBeanNamesForType(Class? type, boolean includeNonSingletons, boolean allowEagerInit) {if (!isConfigurationFrozen() || type null || !allowEagerInit) {// 不可用缓存、类型无效、不允许提前加载初始化// 需要获取当前type的原始类型继续获取数据return doGetBeanNamesForType(ResolvableType.forRawClass(type), includeNonSingletons, allowEagerInit);}MapClass?, String[] cache (includeNonSingletons ? this.allBeanNamesByType : this.singletonBeanNamesByType);String[] resolvedBeanNames cache.get(type);// 如果缓存已经存储了该数据则无需再计算直接返回即可if (resolvedBeanNames ! null) {return resolvedBeanNames;}resolvedBeanNames doGetBeanNamesForType(ResolvableType.forRawClass(type), includeNonSingletons, true);// 这一步就是真正的获取数据遍历beanDefinitionNames的每一个数据符合要求的就会加入到返回的列表中if (ClassUtils.isCacheSafe(type, getBeanClassLoader())) {cache.put(type, resolvedBeanNames);// 便于下一次获取加入缓存中}return resolvedBeanNames; }BeanPostProcessor 从范围上来说从上面的所有的bean成为了特定的bean其次BeanFactoryPostProcessor可以在初始化前修改bean的属性等情况但是BeanPostProcessor只能在初始化后注意初始化不包括init方法执行一些操作。 网上很多文章都说BeanPostProcessor不能修改bean属性其实我看来未必当其实例化之后完全可以拿到实例化后的对象对对象进行一些改值操作也完全可以的 使用方法 public class Student {Value(${name})private String className;public Student() {System.out.println(constructor loading);}public void init(){System.out.println(init loading);} }public class CustomBeanPostProcessor implements BeanPostProcessor {public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if(bean instanceof Student){// 如果当前的bean是Student,则打印日志System.out.println(postProcessBeforeInitialization bean : beanName);}return bean;}public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if(bean instanceof Student){System.out.println(postProcessAfterInitialization bean : beanName);}return bean;} }bean idstudent classStudent init-methodinit / bean classCustomBeanPostProcessor idcustomBeanPostProcessor /输出结果 先打印出了构造器内部执行的话意味着这个时候实例化了Student类 在init方法前执行了postProcessBeforeInitialization 在init方法后执行了postProcessAfterInitialization 源码分析 入口依旧是refresh函数在完成初始化之后进入到finishBeanFactoryInitialization(beanFactory)执行BeanPostProcessor的相关操作中间的流程过长包含了getBean操作genBean操作过于繁琐后续再介绍。 AbstractAutowireCapableBeanFactory 文件 protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {if (System.getSecurityManager() ! null) {AccessController.doPrivileged(new PrivilegedActionObject() {Overridepublic Object run() {invokeAwareMethods(beanName, bean);return null;}}, getAccessControlContext());}else {invokeAwareMethods(beanName, bean);// aware同样是对外提供的钩子}Object wrappedBean bean;if (mbd null || !mbd.isSynthetic()) {wrappedBean applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);// 这一步就是执行自定义的beanpostprocessor的before操作}try {invokeInitMethods(beanName, wrappedBean, mbd);// 执行init方法}catch (Throwable ex) {throw new BeanCreationException((mbd ! null ? mbd.getResourceDescription() : null),beanName, Invocation of init method failed, ex);}if (mbd null || !mbd.isSynthetic()) {wrappedBean applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);// 这一步就是执行自定义的beanpostprocessor的after操作}return wrappedBean; }public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)throws BeansException {Object result existingBean;for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {// 获取所有的BeanPostProcessor对象执行postProcessBeforeInitialization方法result beanProcessor.postProcessBeforeInitialization(result, beanName);if (result null) {return result;}}return result;// 然后把执行结果返回 }public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)throws BeansException {Object result existingBean;for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {result beanProcessor.postProcessAfterInitialization(result, beanName);if (result null) {return result;}}return result; }protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd)throws Throwable {boolean isInitializingBean (bean instanceof InitializingBean);if (isInitializingBean (mbd null || !mbd.isExternallyManagedInitMethod(afterPropertiesSet))) {if (logger.isDebugEnabled()) {logger.debug(Invoking afterPropertiesSet() on bean with name beanName );}if (System.getSecurityManager() ! null) {try {AccessController.doPrivileged(new PrivilegedExceptionActionObject() {Overridepublic Object run() throws Exception {((InitializingBean) bean).afterPropertiesSet();return null;}}, getAccessControlContext());}catch (PrivilegedActionException pae) {throw pae.getException();}}else {((InitializingBean) bean).afterPropertiesSet();}}if (mbd ! null) {// invoke 反射执行init方法String initMethodName mbd.getInitMethodName();if (initMethodName ! null !(isInitializingBean afterPropertiesSet.equals(initMethodName)) !mbd.isExternallyManagedInitMethod(initMethodName)) {invokeCustomInitMethod(beanName, bean, mbd);}} }

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

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

相关文章

上海网站建设服务是什么网络企业网站建设方案

👑专栏内容:Java⛪个人主页:子夜的星的主页💕座右铭:前路未远,步履不停 目录 一、方法的概念1、什么是方法?2、方法的定义3、方法调用的过程 二、方法重载1、重载的概念2、方法签名 在日常生活中…

邯郸专业网站建设报价某qq非主流个性网源码qq空间网站源码dede内核+采集规则

目录 一.部署单体项目 1.远程数据库 1.1远程连接数据库 1.2 新建数据库运行sql文件 2.部署项目到服务器中 3.启动服务器运行 二.部署前后端分离项目 1.远程数据库和部署到服务器 2.利用node环境启动前端项目 3.解决主机无法解析服务器localhost问题 方法一 ​编辑 方法二 一.部…

用什么做视频网站比较好的网站右键禁止

非线性容器实现能快速查找的数据结构,其底层通过 hash 或者红黑树实现,包括 HashMap、HashSet、TreeMap、TreeSet、LightWeightMap、LightWeightSet、PlainArray 七种。非线性容器中的 key 及 value 的类型均满足 ECMA 标准。 HashMap HashMap 可用来存…

越秀凭一己之力打破了行业天花板 - 智慧园区

近几年,房地产市场的供需关系已经发生深刻变化,整个行业都在研究怎么能在营销上作出突围。在这个过程中,数字营销几乎成了必选项。 然而,即使布局了数字营销业务,许多 房企面临的营销困境还是在加深 ,明源君认为…

贷款公司网站模板建app需要多少钱

定义 存储器单位时间内读出/写入的位数或字节数 单位 单位是bps(位/秒)或B/s(字节/秒) 计算公式 基于存储器时频率和数据总线位数的计算方法 公式:带宽 存储器时频率 存储器数据总线位数 / 8 基于存取周期和每…

详细介绍:静态资源js,css免费CDN服务比较

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

如何做qq钓鱼网站深圳网页设计公司在哪

文章首发于公众号「码上GIS」,欢迎关注。文中流向图和城市关系强度图的 ArcMap 10.5 Mxd 工程和数据可在公众号后台回复「190708」和「190709」获取不记得是从哪年开始,每年春运期间,百度都会发布个春运大数据,其中最让人印象深刻…

在AI技术唾手可得的时代,挖掘JavaScript学习资源的新需求成为关键

本文分析了一个广受欢迎的JavaScript学习资源库,该项目系统整理了33个核心JavaScript概念的学习资料,涵盖了从基础数据类型到高级设计模式的完整知识体系,为开发者提供了全面的学习路径和参考资料。a.内容描述核心功…

网站模板网站wordpress手机号网站

前言: 子窗口控件是特殊的子窗口,不需要我们注册窗口类,系统已经注册好了,我们只需要在创建时选择相应的窗口类名。常用的子窗口控件有按钮BUTTON、组合框COMBOBOX、编辑框EDIT、列表框LISTBOX、静态框STATIC、滚动条SCROLLBAR等类…

做生意网站wordpress 栏目页

符号在前就先加/减,符号在后就后加/减 在写代码的过程中,常见的一种情况是需要某个整数类型变量增加 1 或减少 1,Java 提供了一种特殊的运算符,用于这种表达式,叫做自增运算符()和自减运算符&#xff0…

洛谷P9676 [ICPC 2022 Jinan R] Skills

洛谷P9676 [ICPC 2022 Jinan R] Skills P9676 [ICPC 2022 Jinan R] Skills 设计状态时,可以知道要用当前的压掉一维,\(dp_{i,j,0/1/2}\) 表示当前选第 \(0/1/2\) 种,\(i,j\) 表示其余两种的最后选择时间。 如果没有…

微信小程序(uniapp)搭建腾讯云 IM 消息撤回

微信小程序(uniapp)搭建腾讯云 IM 消息撤回2025-10-05 08:13 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: b…

读人形机器人31未来30年

读人形机器人31未来30年1. 先进的技术前景 1.1. 自主决策与认知计算1.1.1. 预计到2055年,最重大的突破之一将是具备先进自主决策能力的人形机器人的出现1.1.2. 借助认知计算和神经网络架构方面的突破,这些机器人将能…

【java面试】redis篇 - 指南

【java面试】redis篇 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco",…

做推文网站营销型网站建设广告语

简洁的结论: 系统环境 ubuntu22.04 nvidia-535解决方案 删除/etc/X11/xorg.conf 文件 记录一下折腾大半天的问题。 ubuntu系统是22.04,之前使用的时候更新驱动导致桌面崩溃,重新安装桌面安装不上,请IT帮忙,IT一番操作过后也表示…

洛谷P8421 [THUPC 2022 决赛] rsraogps

洛谷P8421 [THUPC 2022 决赛] rsraogps P8421 [THUPC 2022 决赛] rsraogps - 洛谷 因为从一个点最多会变化 \(\log V\) 次(这三种操作都是这样),考虑扫描线,这样每次更新前面答案贡献时,就有可能做到 \(\log V\) …

正规的网站建设专业公司学校微网站模板下载地址

原文:https://www.toutiao.com/i6855460778359816715/平台:头条作者:程序员不就是0和1一、 备份恢复策略进行备份或恢复操作时需要考虑一些因素:1、确定要备份的表的存储引擎是事务型还是非事务型,两种不同的存储引擎备…

实用指南:流媒体基础解析:音视频封装格式与传输协议

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

网站友链展示设计图片

模板的使用 1.如何使用模板 在manage.py的同级文件夹中创建templates在setting.py的文件中把第58行DIRS: [ ],改成DIRS: [os.path.join(BASE_DIR,templates)], 知识点: os.path.join(BASE_DIR,templates) 拼接两个字符串 BASE_DIR找到项目根目录127.0.0.1:8000/myadmin/templ…

校园网站建设资金来源有南阳做网站优化公司

文章目录 k8s 部署yapi平台前言准备工作构建yapi镜像Dockerfileentrypoint.shbuild.sh源码下载构建镜像启动mongo数据库新建nfs服务mongo创建mongo服务初始化数据启动yapi服务创建yapi服务查看密码访问地址k8s 部署yapi平台 前言 部署yapi平台需要mo