目录
ConfigurationClassPostProcessor中的postProcessBeanDefinitionRegistry方法
ConfigurationClassPostProcessor中的postProcessBeanFactory方法
上一章内容回顾与本章内容概述
上篇文章主要讲的是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对象,添加到容器中