欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring源码分析之扩展点BeanDefinitionRegistryPostProcessor

程序员文章站 2022-05-07 21:54:04
...

一、BeanDefinitionRegistryPostProcessor接口

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

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

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

spring源码分析之扩展点BeanDefinitionRegistryPostProcessor

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

spring源码分析之扩展点BeanDefinitionRegistryPostProcessor

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

spring源码分析之扩展点BeanDefinitionRegistryPostProcessor

 

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

 二、类关系结构图

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

spring源码分析之扩展点BeanDefinitionRegistryPostProcessor

 

 

三、代码示例: 

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