BeanFactoryPostProcessor 作用(举例)

1、BeanFactoryPostProcessor 作用

作用之一: 解析 xml 引入的资源配置文件里的值

看下两个配置文件就可以明白了

两个配置文件:

 1、资源配置文件

 

2、spring xml配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns="http://www.springframework.org/schema/beans"
      xmlns:context="http://www.springframework.org/schema/context"
      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"
      default-autowire="byName">

   <context:property-placeholder location="application.properties"/>

   <bean id="messageService" class="com.tt.ioc.service.impl.MessageServiceImpl">
       <property name="url" value="${messageService.url}"/>
   </bean>
</beans>


接下来跟着源码论证一下: 

刚开始生成的这个 BeanDefinition ,它里面的引入的一些 properties 类型的值还只是一个普通字符串,如下图

 

 

 

上述提到的刚开始,也就是当代码执行到下图所示(注意 : obtainFreshBeanFactory 就是根据 xml 文件生成 BeanDefinition 并放入 BeanFactory 中)

 

 

 

 

生成的bean(按规定这里常说的 bean 就是指 BeanDefinition ) ,放到了 beanFactory 里的 beanDefinitionMap     如下图所示

这个beanDefinitionMap 就是以自己在配置文件指定的id为key,以BeanDefinition对象为值的 concurrentHashMap

 

 

 

 

接下来继续看 如下图所示,在执行 invokeBeanFactoryPostProcessors 之后,此时的 property 配置的值已经被解析出来了

 

 

 

再往里追 大致流程如下

注意

String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);

这句代码就是根据类型获取到 beanDefinitionMap 里的key,这里得到了:org.springframework.context.support.PropertySourcesPlaceholderConfigurer#0( 相当于我们 xml 文件配置的 bean 里的 id 属性);

可以确定它其实就是一个 BeanFactoryPostProcessor ,它 spring 自动添加的一个类,上面那个图片可以清晰看到

 

 

 

现在进入invokeBeanFactoryPostProcessors(调用BeanFactory后处理器),这不就是我们要论证的主题:beanfacotryprocesser 作用   继续跟进,继续看图

 

自己可以跟进去看:看下核心

总之自己跟着代码走吧... 太深了  哈哈

最后的最后 取出来了:

 

 

大佬们多多指教!

看源码着实痛苦,而且不知道自己能不能看懂,也不知道自己天天看的是啥,反正慢慢看呗!总有一天会懂吧

 

posted on 2021-11-26 15:39  bkytian  阅读(831)  评论(0编辑  收藏  举报

导航