Spring之【ConfigurationClassPostProcessor】

发布于:2025-07-25 ⋅ 阅读:(29) ⋅ 点赞:(0)

目录

上一章内容回顾与本章内容概述

ConfigurationClassPostProcessor中的postProcessBeanDefinitionRegistry方法

回调时机

做了哪些事情

处理@Component注解

处理@PropertySource注解

处理@ComponentScan注解,执行包扫描

处理@Import注解

处理@ImportResource注解

处理@Bean注解

ConfigurationClassPostProcessor中的postProcessBeanFactory方法

回调时机

做了哪些事情

增强配置类

添加BeanPostProcessor


上一章内容回顾与本章内容概述

        上篇文章主要讲的是Spring中的Bean工厂后置处理器BeanFactoryPostProcessor,是Spring的扩展点之一

        本章内容将会介绍Spring中的一个比较重要的内部组件Bean,也就是本文标题中写到的ConfigurationClassPostProcessor,该类实现了BeanDefinitionRegistryPostProcessor接口,而BeanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor的子接口,即ConfigurationClassPostProcessor是一个Bean工厂后置处理器

package org.springframework.context.annotation;

// 实现了BeanDefinitionRegistryPostProcessor接口
// 实现了PriorityOrdered接口,这个和执行方法回调顺序有关
public class ConfigurationClassPostProcessor implements BeanDefinitionRegistryPostProcessor,
		PriorityOrdered, ResourceLoaderAware, BeanClassLoaderAware, EnvironmentAware {


/**
 * 实现了BeanDefinitionRegistryPostProcessor提供了的方法
 */
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
    // ...
       
    // ...
}

/**
 * 实现了BeanFactoryPostProcessor提供了的方法
 */
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
    // ...
       
    // ...
}

}

ConfigurationClassPostProcessor中的postProcessBeanDefinitionRegistry方法

回调时机

Spring是在AbstractApplicationContext类中的refresh()方法的invokeBeanFactoryPostProcessors(beanFactory)这一步骤中执行的回调,具体如下

package org.springframework.context.support;

public abstract class AbstractApplicationContext extends DefaultResourceLoader
		implements ConfigurableApplicationContext {

    // ...
    
	@Override
	public void refresh() throws BeansException, IllegalStateException {
        // ...
        
        // 获得一个Bean工厂:DefaultListableBeanFactory
        ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
        // 执行Bean工厂后处理器
		invokeBeanFactoryPostProcessors(beanFactory);

        // ...
    }

    // ...
}
package org.springframework.context.support;

public abstract class AbstractApplicationContext extends DefaultResourceLoader
		implements ConfigurableApplicationContext {
    // ...

    protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
        // 调用PostProcessorRegistrationDelegate中的方法执行Bean工厂后处理器的方法回调
        PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());

        // ...
    }

    // ...
}
package org.springframework.context.support;

final class PostProcessorRegistrationDelegate {
    // ...

    public static void invokeBeanFactoryPostProcessors(
            ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
        // ...

        // 定义一个集合用于存放接下来要执行的BeanDefinitionRegistryPostProcessor类型的对象实例
        List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
        // 这里拿到一个数组,数组中的其中一个元素是ConfigurationClassPostProcessor的beanName:org.springframework.context.annotation.internalConfigurationAnnotationProcessor
        String[] postProcessorNames =
                beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
        for (String ppName : postProcessorNames) {
            if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                // ConfigurationClassPostProcessor实现了PriorityOrdered接口
                // 这里创建了ConfigurationClassPostProcessor对象并放入currentRegistryProcessors集合中
                currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                
                // ...
            }
        }
        // ...
        
        // 执行currentRegistryProcessors集合中对象的方法
        invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
        currentRegistryProcessors.clear();

        // ...
    }

    // ...
}

package org.springframework.context.support;

final class PostProcessorRegistrationDelegate {
    // ...

	private static void invokeBeanDefinitionRegistryPostProcessors(
			Collection<? extends BeanDefinitionRegistryPostProcessor> postProcessors, BeanDefinitionRegistry registry) {

		for (BeanDefinitionRegistryPostProcessor postProcessor : postProcessors) {
            // 执行BeanDefinitionRegistryPostProcessor的BeanDefinitionRegistryPostProcessor方法
            // ConfigurationClassPostProcessor就是BeanDefinitionRegistryPostProcessor的实现类之一
			postProcessor.postProcessBeanDefinitionRegistry(registry);
		}
	}

    // ...
}

做了哪些事情

处理@Component注解

也包括@Controller、@Service、@Repository、@Configuration注解

处理@PropertySource注解

处理@ComponentScan注解,执行包扫描

处理@Import注解

处理@ImportResource注解

处理@Bean注解

解析这些注解将Bean对应的BeanDefinition注册到Spring容器中,也就是存储到DefaultListableBeanFactory维护的beanDefinitionMap集合中

ConfigurationClassPostProcessor中的postProcessBeanFactory方法

回调时机

同样是在AbstractApplicationContext类中的refresh()方法的invokeBeanFactoryPostProcessors(beanFactory)这一步骤中执行的回调,具体是在所有的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegister执行完毕之后再执行

package org.springframework.context.support;

final class PostProcessorRegistrationDelegate {
    // ...

	public static void invokeBeanFactoryPostProcessors(
			ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
        // ...
        
        // 存放所有的BeanDefinitionRegistryPostProcessor对象实例
        List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
        // ...
        
        // 当前要执行的BeanDefinitionRegistryPostProcessor
        List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();

        String[] postProcessorNames =
                beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
	    for (String ppName : postProcessorNames) {
            if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                // 这里创建ConfigurationClassPostProcessor对象,并放入currentRegistryProcessors集合中
                currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                processedBeans.add(ppName);
            }
        }

        sortPostProcessors(currentRegistryProcessors, beanFactory);
        // ConfigurationClassPostProcessor对象来到了registryProcessors集合中
	    registryProcessors.addAll(currentRegistryProcessors);
        invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors,         registry);
	    currentRegistryProcessors.clear();

        // ...

        // 执行registryProcessors集合中所有对象的postProcessBeanFactory方法
        invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);

        // ...
    }

    // ...

    
	private static void invokeBeanFactoryPostProcessors(
			Collection<? extends BeanFactoryPostProcessor> postProcessors, ConfigurableListableBeanFactory beanFactory) {
        // ConfigurationClassPostProcessor对象在postProcessors集合中
		for (BeanFactoryPostProcessor postProcessor : postProcessors) {
            // 这里执行了ConfigurationClassPostProcessor的postProcessBeanFactory方法
			postProcessor.postProcessBeanFactory(beanFactory);
		}
	}

    // ...
}

做了哪些事情

增强配置类

  • 遍历当前容器中的所有BeanDefinition

  • 对于每一个BeanDefinition,检查是否是@Configuration类(Full模式配置类),识别出符合条件的类

  • 使用CGLIB动态生成配置类的子类,修改原始配置类的BeanDefinition信息,将BeanDefinition的beanClass属性更改为生成的CGLIB子类的Class对象

添加BeanPostProcessor

直接创建了一个ImportAwareBenPostProcessor对象,添加到容器中


网站公告

今日签到

点亮在社区的每一天
去签到