1 BeanDefinitionRegistryPostProcessor扩展点
public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry var1) throws BeansException;
}
首先看一下BeanDefinitionRegistryPostProcessor
的父类BeanFactoryPostProcessor
,您可能对BeanDefinitionRegistryPostProcessor
有些陌生,但想必对BeanFactoryPostProcessor
一定不陌生吧,这个是在Spring容器刷新时,创建完BeanFactory后会调用的后置处理器
// 代码来自AbstractApplicationContext 545 行
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");
// 嘿哥们,请注意,所有的BeanFactory后置处理器都是在这里被调用哒
invokeBeanFactoryPostProcessors(beanFactory);
// Register bean processors that intercept bean creation.
registerBeanPostProcessors(beanFactory);
beanPostProcess.end();
// Initialize message source for this context.
initMessageSource();
// Initialize event multicaster for this context.
initApplicationEventMulticaster();
// Initialize other special beans in specific context subclasses.
onRefresh();
// Check for listener beans and register them.
registerListeners();
// Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);
// Last step: publish corresponding event.
finishRefresh();
}
}
从上一步点进去之后就可以看到下面这段:
// 代码来自 AbstractApplicationContext 746行
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
// 再从 invokeBeanFactoryPostProcessors 这里点进去
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)
if (!NativeDetector.inNativeImage() && beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
}
}
接下来:
// 代码来自:PostProcessorRegistrationDelegate 78行
if (beanFactory instanceof BeanDefinitionRegistry) {
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
// 查出来所有的 BeanDefinitionRegistryPostProcessor 后置处理器
if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
BeanDefinitionRegistryPostProcessor registryProcessor =
(BeanDefinitionRegistryPostProcessor) postProcessor;
registryProcessor.postProcessBeanDefinitionRegistry(registry);
registryProcessors.add(registryProcessor);
}
else {
regularPostProcessors.add(postProcessor);
}
}
}
// 执行它们!!!!
invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
这便是这个扩展点的渊源啦
2 如何使用呢?
// 这是在手写Mini版本Easy Es 中初期的一段代码,用于替换Mapper的扫描和BeanDefinition
@Component
public class MapperScannerRegister implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
// 1. 扫描包
Set<Class<?>> classes = ClassScanner.scanPackage("tax.szz.mini.test.mapper");
for (Class<?> clazz : classes) {
// 1. 创建 BeanDefinition
RootBeanDefinition beanDefinition = new RootBeanDefinition(clazz);
String beanClassName = clazz.getName();
// 2. 设置 BeanName
beanDefinition.setBeanClassName(beanClassName);
beanDefinition.getConstructorArgumentValues().addGenericArgumentValue(beanClassName);
beanDefinition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);
beanDefinition.setBeanClass(MapperFactoryBean.class);
registry.registerBeanDefinition(StrUtil.lowerFirst(clazz.getSimpleName()), beanDefinition);
}
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
}
}