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

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

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

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

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

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

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

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

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

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

问题分析

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

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

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

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

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

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • 三言两语说透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化和反柯里化的概念、实现原理和应用
  • 雅柏威士忌多款单品价格大跌,泥煤顶流也不香了?

    来源 | 烈酒商业观察编 | 肖海林今年以来,威士忌市场开始出现了降温迹象,越来越多不断暴涨的网红威士忌也开始悄然回归市场理性。近日,LVMH集团旗下苏格兰威士忌品牌雅柏(Ardbeg
  • 破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事“起猛了,我能看得懂日语了”。“为什么日本人说话我能听懂?”“中文不像中文,日语不像日语,但是我竟然看懂了”…&hell
  • 2299元起!iQOO Pad明晚首销:性能最强天玑平板

    5月23日,iQOO如期举行了新品发布会,除了首发安卓最强旗舰处理器的iQOO Neo8系列新机外,还在发布会上推出了旗下首款平板电脑——iQOO Pad,其最大的卖点
  • 苹果MacBook Pro 2021测试:仍不支持平滑滚动

    据10月30日9to5 Mac 消息报道,苹果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后获得了不错的评价,亮点包括行业领先的性能,令人印象深刻的电池续航,精美丰
  • 世界人工智能大会国际日开幕式活动在世博展览馆开启

    30日上午,世界人工智能大会国际日开幕式活动在世博展览馆开启,聚集国际城市代表、重量级院士专家、国际创新企业代表,共同打造人工智能交流平台。上海市副市
  • 电博会与软博会实现"线下+云端"的双线融合

    在本次“电博会”与“软博会”双展会利好条件的加持下,既可以发挥展会拉动人流、信息流、资金流实现快速交互流动的作用,继而推动区域经济良性发展;又可以聚
  • 利用职权私自解除被封帐号 Meta开除20多名员工

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