一、何谓BeanProcessor
BeanPostProcessor是SpringFramework里非常重要的核心接口之一,我先贴出一段源代码:
在这里我先简单解释一下其注释的含义:
这个接口允许我们自定义修改新bean的一个实例,比如说:检查它们的接口或者将他们包装成代理对象等,ApplicationContexts能自动察觉到我们在BeanProcessor里对对象作出的改变,并在后来创建该对象时应用其对应的改变。
这两个方法分别对应IOC容器对对象初始化前的操作和对象初始化后的操作
下面我们来演示一个例子:
StudentEntity:
运行得到如下结果:
我们可以看到在配置文件里定义的bean属性已经发生改变
二、SpringFramework中BeanPostProcessor经典应用场景
1.初始化BeanPostProcessor的源码
根据 ClassPathXmlApplicationContext的构造方法,我们可以看到该类初始化的时候会调用refresh():
[email protected]实现的代码跟踪
注意AutowiredAnnotationBeanPostProcessor最终也是BeanPostProcessor的实现类,具体类的描述我就不再这里阐述了,大家可自行查看源码
3、SpringBoot中的定制化内嵌web容器
这个EmbeddedServletContainerCustomizerBeanPostProcessor直接实现的就是BeanPostProcessor,该类下请关注如下方法:
一、何谓BeanProcessor
BeanPostProcessor是SpringFramework里非常重要的核心接口之一,我先贴出一段源代码:
View Code
在这里我先简单解释一下其注释的含义:
这个接口允许我们自定义修改新bean的一个实例,比如说:检查它们的接口或者将他们包装成代理对象等,ApplicationContexts能自动察觉到我们在BeanProcessor里对对象作出的改变,并在后来创建该对象时应用其对应的改变。
这两个方法分别对应IOC容器对对象初始化前的操作和对象初始化后的操作
下面我们来演示一个例子:
StudentEntity:
View Code
TestBeanPostProcessor:
View Code
Main方法:
View Code
spring-config.xml关键代码:
View Code
运行得到如下结果:
我们可以看到在配置文件里定义的bean属性已经发生改变
二、SpringFramework中BeanPostProcessor经典应用场景
1.初始化BeanPostProcessor的源码
根据 ClassPathXmlApplicationContext的构造方法,我们可以看到该类初始化的时候会调用refresh():
View Code
那么紧接着在AbstractApplicationContext中找到refresh()方法:
View Code
那么在这里Spring会进行一系列的初始化操作,我们请留意registerBeanPostProcessors(beanFactory);这句代码,追踪一下我们可以看到在该方法里注册Processor:
View Code
[email protected]实现的代码跟踪
注意AutowiredAnnotationBeanPostProcessor最终也是BeanPostProcessor的实现类,具体类的描述我就不再这里阐述了,大家可自行查看源码
3、SpringBoot中的定制化内嵌web容器
这个EmbeddedServletContainerCustomizerBeanPostProcessor直接实现的就是BeanPostProcessor,该类下请关注如下方法:
View Code
View Code
View Code
这里面有一个接口:EmbeddedServletContainerCustomizer 该接口有个实现类 ServerProperties 熟悉springboot外部化配置原理的同胞们其实一看便知
View Code
在这个类里我们可以找到customizeTomcat方法,大家自行看看喽,类图如下: