AbstractApplicationContext提供的postProcessBeanFactory空方法
postProcessBeanFactory这个方法没名字跟BeanFactoryPostProcessor接口中的方法一样,但是他的功能是提供给子类进行添加一些额外的功能,比如添加BeanPostProcessor接口的实现,或者定制一些其他的功能也是可以的,因为这个方法你可以拿到BeanFactory,自然是可以对他进行一些功能的定制的。
这里看下Spring 提供的子类 GenericWebApplicationContext 是如何实现的:
@Override
protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
if (this.servletContext != null) {
beanFactory.addBeanPostProcessor(new ServletContextAwareProcessor(this.servletContext));
beanFactory.ignoreDependencyInterface(ServletContextAware.class);
}
WebApplicationContextUtils.registerWebApplicationScopes(beanFactory, this.servletContext);
WebApplicationContextUtils.registerEnvironmentBeans(beanFactory, this.servletContext);
}
这里他注册了一个 ServletContextAwreProcessor 到 beanFactory 中, ServletContexAwareProcessor 是一个 BeanPostProcessor 接口的子类。
重头戏BeanFactoryPostProcessor
接下来分析 AbstractApplicationContext#refresh 中的 invokeBeanFactoryPostProcessors 方法,这个方法用来注册和执行 BeanFactoryPostProcessor 的。
直接上源码:
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
// 执行所有的BeanFactoryPostProcessor
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
// Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime
// (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)
// aop的处理
if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
}
}
重点在这里:
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
首先获取 BeanFactoryPostProcessor 的集合,这里获取到都是用户在定制 BeanFactory 时 add 加入进去的,进入这个方法:
public static void invokeBeanFactoryPostProcessors(
ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
// Invoke BeanDefinitionRegistryPostProcessors first, if any.
// 已经处理的Bean
Set<String> processedBeans = new HashSet<>();
// 先进性外部BFPP的处理,并且判断当前Factory是否是BeanDefinitionRegistry
if (beanFactory instanceof BeanDefinitionRegistry) {
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
// 保存BFPP的Bean
List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
// 保存BDRPP的Bean
List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
// 开始处理外部传入的BFPP
for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
// 先处理BDRPP
if (postProcessor

本文深入探讨了Spring中BeanFactoryPostProcessor的执行过程。从AbstractApplicationContext的postProcessBeanFactory方法开始,分析了DefaultListableBeanFactory的postProcessBeanFactory方法,展示了BeanFactoryPostProcessor如何注册和执行。文章通过流程图说明了执行顺序,强调了BeanDefinitionRegistryPostProcessor和AutowiredAnnotationBeanPostProcessor的作用,并解释了它们在容器启动时的添加和解析过程。
最低0.47元/天 解锁文章
787

被折叠的 条评论
为什么被折叠?



