当前位置:首页 > 科技  > 软件

答读者问:BeanFactoryPostProcessor 似乎失效了?

来源: 责编: 时间:2023-11-06 17:19:43 175观看
导读有小伙伴在学习 Spring 源码视频的时候,看了松哥讲的 BeanFactoryPostProcessor 的用法之后,提出了这样一个问题:图片图片我来跟大家补充一下这个问题的上下文:我讲了 BeanFactoryPostProcessor,分析了其原理,也讲了具体的

有小伙伴在学习 Spring 源码视频的时候,看了松哥讲的 BeanFactoryPostProcessor 的用法之后,提出了这样一个问题:inn28资讯网——每日最新资讯28at.com

图片图片inn28资讯网——每日最新资讯28at.com

图片图片inn28资讯网——每日最新资讯28at.com

我来跟大家补充一下这个问题的上下文:inn28资讯网——每日最新资讯28at.com

我讲了 BeanFactoryPostProcessor,分析了其原理,也讲了具体的使用场景,一个典型的使用场景是我们在 XML 中定义 Bean 的时候,如果 Bean 的属性是使用了 properties 文件占位符如 ${db.username} 这种,那么在 BeanFactoryPostProcessor 阶段,就会对这个占位符进行处理,将其替换成真正的 value。然后我还顺手给大家举了一个例子,我在 XML 文件中定义 Bean 的时候,给 Bean 的某一个属性设置 value 为 ^username,然后在 BeanFactoryPostProcessor 中,我将 ^username 改为某一个字符串。inn28资讯网——每日最新资讯28at.com

小伙伴看了松哥讲的内容之后,也照着写了一个,就是上面图片中的代码,不同的是,他是将 XML 配置改为了 Java 代码配置,结果发现属性 hok 并未变为 NB,因此有了上述问题。inn28资讯网——每日最新资讯28at.com

我觉得这个问题问的很好,给了小伙伴们一个从其他方面理解 Spring 的机会,这也是我前面一直强调的,这次的 Spring 视频需要各位小伙伴一起发力,大家有关于 Spring 的任何问题都可以提,我负责通过源码来回答你。inn28资讯网——每日最新资讯28at.com

问题分析

这个问题的分析,得先从 BeanDefinition 开始。在讲 BeanFactoryPostProcessor 之前,松哥已经和小伙伴们分析过 BeanDefinition 了,无论我们是通过 Java 代码还是通过 XML 文件定义的 Bean 对象,在解析称为 Bean 对象之前,得先解析成为 BeanDefinition,BeanDefinition 则有不同的分类,对于 XML 文件定义的 Bean,最终解析为 GenericBeanDefinition,而通过 @Bean 注解定义的 Bean 则解析为 ConfigurationClassBeanDefinition。inn28资讯网——每日最新资讯28at.com

但是这两个的处理原理显然是有差异的。inn28资讯网——每日最新资讯28at.com

对于 XML 定义的 Bean 来说,很明显 XML 中的所有属性都要先解析到 BeanDefinition 中,包括我们在 XML 中配置的 Bean 的各种属性,这一步是在 Spring 容器 refresh 方法中构建 BeanFactory 的时候完成的(obtainFreshBeanFactory 方法),这一步完成之后,在后面的步骤会去执行容器中所有的 BeanFactoryPostProcessor(invokeBeanFactoryPostProcessors),此时就会把前面解析出来的 BeanDefinition 中带有占位符的属性给替换过来,最后在 refresh 方法中执行 finishBeanFactoryInitialization 方法完成 Bean 的初始化。inn28资讯网——每日最新资讯28at.com

按照上面这一套流程顺序,占位符被解析成为正常字符串没什么问题。inn28资讯网——每日最新资讯28at.com

但是,如果是 @Bean 注解配置的 Bean,则会有所差异。inn28资讯网——每日最新资讯28at.com

首先,@Bean 注解所标记的方法要被解析为一个 ConfigurationClassBeanDefinition,这个过程本身是通过 ConfigurationClassPostProcessor 来完成的,而 ConfigurationClassPostProcessor 本质上其实就是一个 BeanFactoryPostProcessor,换言之,@Bean 注解标记的方法是在 BeanFactoryPostProcessor 中被解析为 ConfigurationClassBeanDefinition 的。ConfigurationClassBeanDefinition 这个 BeanDefinition 主要用来记录 @Bean 注解所标记的方法所属的对象、方法的名称、方法对象、方法参数、注解的参数等等信息,把这些信息记录下来,将来在初始化 Bean 的时候,通过反射执行目标方法就可以了,即方法里边的内容是什么,ConfigurationClassBeanDefinition 其实并不关心。inn28资讯网——每日最新资讯28at.com

最后则是和 XML 一样,在 finishBeanFactoryInitialization 方法中完成 Bean 的初始化。inn28资讯网——每日最新资讯28at.com

经过上面分析,小伙伴们可以看到,通过 @Bean 注解定义的 Bean,我们为属性赋值是在方法内部完成的,这些方法内部的逻辑其实并未被解析到 BeanDefinition 中,显然也没有必要把方法内部的逻辑解析到 BeanDefinition 上去,因此,通过 @Bean 注解定义的 Bean,如果属性中使用了占位符,是无法通过 BeanFactoryPostProcessor 自动解析的。inn28资讯网——每日最新资讯28at.com

好啦,现在小伙伴提出的问题大家伙都明白了吧?inn28资讯网——每日最新资讯28at.com

inn28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-17274-0.html答读者问:BeanFactoryPostProcessor 似乎失效了?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 关于 Vue 样式的七个你(可能)不知道的技巧

下一篇: Go 与数据可视化:使用 Gonum 和 Plot 库探索数据之美

标签:
  • 热门焦点
  • 把LangChain跑起来的三个方法

    把LangChain跑起来的三个方法

    使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来
  • 一文看懂为苹果Vision Pro开发应用程序

    一文看懂为苹果Vision Pro开发应用程序

    译者 | 布加迪审校 | 重楼苹果的Vision Pro是一款混合现实(MR)头戴设备。Vision Pro结合了虚拟现实(VR)和增强现实(AR)的沉浸感。其高分辨率显示屏、先进的传感器和强大的处理能力
  • 只需五步,使用start.spring.io快速入门Spring编程

    只需五步,使用start.spring.io快速入门Spring编程

    步骤1打开https://start.spring.io/,按照屏幕截图中的内容创建项目,添加 Spring Web 依赖项,并单击“生成”按钮下载 .zip 文件,为下一步做准备。请在进入步骤2之前进行解压。图
  • 重估百度丨“晚熟”的百度云,能等到春天吗?

    重估百度丨“晚熟”的百度云,能等到春天吗?

    ©自象限原创作者|程心排版|王喻可2016年7月13日,百度云计算战略发布会在北京举行,宣告着百度智能云的正式启程。彼时的会场座无虚席,甚至排队排到了门外,在场的所有人几乎都
  • 8月见!小米MIX Fold 3获得3C认证:支持67W快充

    8月见!小米MIX Fold 3获得3C认证:支持67W快充

    这段时间以来,包括三星、一加、荣耀等等有不少品牌旗下的最新折叠屏旗舰都得到了不少爆料,而小米新一代折叠屏旗舰——小米MIX Fold 3此前也屡屡被传
  • 2纳米决战2025

    2纳米决战2025

    集微网报道 从三强争霸到四雄逐鹿,2nm的厮杀声已然隐约传来。无论是老牌劲旅台积电、三星,还是誓言重回先进制程领先地位的英特尔,甚至初成立不久的新
  •  首发天玑9200+ iQOO Neo8系列发布首销售价2299元起

    首发天玑9200+ iQOO Neo8系列发布首销售价2299元起

    2023年5月23日晚,iQOO Neo8系列正式发布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro强悍登场,限时售价3099元起;价位段最强性能手机iQOO Neo8同期上市
  • iQOO Neo8系列今日官宣:首发天玑9200+ 全球安卓最强芯!

    iQOO Neo8系列今日官宣:首发天玑9200+ 全球安卓最强芯!

    在昨日举行的的联发科新一代旗舰芯片天玑9200+的发布会上,iQOO官方也正式宣布,全新的iQOO Neo8系列新品将全球首发搭载这款当前性能最强大的移动平台
  • 利用职权私自解除被封帐号 Meta开除20多名员工

    利用职权私自解除被封帐号 Meta开除20多名员工

    11月18日消息,据外媒援引知情人士表示,过去一年时间内,Facebook母公司Meta解雇或处罚了20多名员工以及合同工,指控这些人通过内部系统以不当方式重置用户帐号,其
Top