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

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

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

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

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

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

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

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

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

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

问题分析

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

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

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

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

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

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • 俄罗斯:将审查iPhone等外国公司设备 保数据安全

    俄罗斯:将审查iPhone等外国公司设备 保数据安全

    iPhone和特斯拉都属于在各自领域领头羊的品牌,推出的产品也也都是数一数二的,但对于一些国家而言,它们的产品可靠性和安全性还是在限制范围内。近日,俄罗斯联邦通信、信息技术
  • 分布式系统中的CAP理论,面试必问,你理解了嘛?

    分布式系统中的CAP理论,面试必问,你理解了嘛?

    对于刚刚接触分布式系统的小伙伴们来说,一提起分布式系统,就感觉高大上,深不可测。而且看了很多书和视频还是一脸懵逼。这篇文章主要使用大白话的方式,带你理解一下分布式系统
  • 让我们一起聊聊文件的操作

    让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • 微信语音大揭秘:为什么禁止转发?

    微信语音大揭秘:为什么禁止转发?

    大家好,我是你们的小米。今天,我要和大家聊一个有趣的话题:为什么微信语音不可以转发?这是一个我们经常在日常使用中遇到的问题,也是一个让很多人好奇的问题。让我们一起来揭开这
  • 三万字盘点 Spring 九大核心基础功能

    三万字盘点 Spring 九大核心基础功能

    大家好,我是三友~~今天来跟大家聊一聊Spring的9大核心基础功能。话不多说,先上目录:图片友情提示,本文过长,建议收藏,嘿嘿嘿!一、资源管理资源管理是Spring的一个核心的基础功能,不
  • OPPO、vivo、小米等国内厂商Q2在印度智能手机市场份额依旧高达55%

    OPPO、vivo、小米等国内厂商Q2在印度智能手机市场份额依旧高达55%

    7月20日消息,据外媒报道,研究机构的报告显示,在全球智能手机出货量同比仍在下滑的大背景下,印度这一有潜力的市场也未能幸免,出货量同比也有下滑,多家厂
  • 华为将推出盘古数字人大模型 可帮助用户12小时完成数字人生成

    华为将推出盘古数字人大模型 可帮助用户12小时完成数字人生成

    在今日举行的2023年华为云数字文娱AI创新峰会上,华为云全球Marketing与销售服务总裁石冀琳表示,华为云将在后续推出盘古数字人大模型,可帮助用户12小
  • 2纳米决战2025

    2纳米决战2025

    集微网报道 从三强争霸到四雄逐鹿,2nm的厮杀声已然隐约传来。无论是老牌劲旅台积电、三星,还是誓言重回先进制程领先地位的英特尔,甚至初成立不久的新
  • 电博会上海尔智家模拟500平大平层,还原生活空间沉浸式体验

    电博会上海尔智家模拟500平大平层,还原生活空间沉浸式体验

    电博会为了更好地让参展观众真正感受到智能家居的绝妙之处,海尔智家的程传岭先生同样介绍了展会上海尔智家的模拟500平大平层,还原生活空间沉浸式体验。程传
Top