Spring源码分析之扩展点BeanDefinitionRegistryPostProcessor

一、BeanDefinitionRegistryPostProcessor接口

  • 简介:该接口继承了BeanFactoryPostProcessor接口,且新增postProcessBeanDefinitionRegistry方法。

方法参数是BeanDefinitionRegistry对象,BeanDefinitionRegistry对象是bean定义的保存中心(实际底层就是BeanDefinitionMap 后续会专门详细介绍)。这里可以简单看下源码,如下图所示。

这里在BeanDefinitionRegistry的子类DefaultListableBeanFactory中,可以看到。

Spring源码分析之扩展点BeanDefinitionRegistryPostProcessor_第1张图片

在时机上,可以理解为该方法与spring容器的初始化扫描同期执行,即(将扫描的bean转化成BeanDefinition,放入到BeanDefinitionMap之前) 这里也可以通过Debug验证。

Spring源码分析之扩展点BeanDefinitionRegistryPostProcessor_第2张图片

当执行完这行代码之后,我们可以看到我们自己实现的MyBeanDefinitionRegistryPostProcessor被放入到BeanDefinitionMap中。

Spring源码分析之扩展点BeanDefinitionRegistryPostProcessor_第3张图片

 

  • 作用:作为spring的扩展点,可以实现将自己定义的bean动态的扫描并注册到spring容器当中。

 二、类关系结构图

BeanDefinitionRegistryPostProcessor的类关系结构图,如下图所示。

Spring源码分析之扩展点BeanDefinitionRegistryPostProcessor_第4张图片

 

 

三、代码示例: 

package com.evan.config;

import org.springframework.context.annotation.ComponentScan;

@ComponentScan("com.evan")
public class MyConfig {
}
package com.evan.processor;

import com.evan.service.EvanService;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.stereotype.Component;

@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {

	// --- 此方法在所有BeanDefinition将要被加载(spring初始化本身需要的BeanDefinition除外),它优先于postProcessBeanFactory方法执行。
	//作用:可以将自己定义的类动态的加入到spring容器。
	@Override
	public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
		System.out.println("此时的registry中有: " + registry.getBeanDefinitionCount() + " 个BeanDefinition.");
		RootBeanDefinition rbd = new RootBeanDefinition(EvanService.class);
		registry.registerBeanDefinition("Evan", rbd);
	}

	//继承自BeanFactoryPostProcessor
	// 作用:在bean实例化之前,动态的修改配置BeanDefinition,其实不止是可以修改BeanDefinition,还可以修改beanFactory中的其他信息。
	@Override
	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
		System.out.println("此时的registry中有: " + beanFactory.getBeanDefinitionCount() + " 个BeanDefinition.");
	}
}
package com.evan.service;

public class EvanService {
	public EvanService() {
		System.out.println("EvanService的无参构造执行了!");
	}
}

 

package com.evan.test;

import com.evan.config.MyConfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test {
	public static void main(String[] args) {
		AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(MyConfig.class);
		System.out.println(ac.getBeanDefinition("Evan"));
	}
}

 打印结果:

 

此时的registry中有: 7 个BeanDefinition.
此时的registry中有: 8 个BeanDefinition.
EvanService的无参构造执行了!
Root bean: class [com.evan.service.EvanService]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null

 

你可能感兴趣的:(Spring,BeanDefinition)