spring源码分析之扩展点BeanDefinitionRegistryPostProcessor
程序员文章站
2022-05-07 21:54:04
...
一、BeanDefinitionRegistryPostProcessor接口
- 简介:该接口继承了BeanFactoryPostProcessor接口,且新增postProcessBeanDefinitionRegistry方法。
方法参数是BeanDefinitionRegistry对象,BeanDefinitionRegistry对象是bean定义的保存中心(实际底层就是BeanDefinitionMap 后续会专门详细介绍)。这里可以简单看下源码,如下图所示。
这里在BeanDefinitionRegistry的子类DefaultListableBeanFactory中,可以看到。
在时机上,可以理解为该方法与spring容器的初始化扫描同期执行,即(将扫描的bean转化成BeanDefinition,放入到BeanDefinitionMap之前) 这里也可以通过Debug验证。
当执行完这行代码之后,我们可以看到我们自己实现的MyBeanDefinitionRegistryPostProcessor被放入到BeanDefinitionMap中。
- 作用:作为spring的扩展点,可以实现将自己定义的bean动态的扫描并注册到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
下一篇: 浅谈华为如何实现区块链的安全隐私保护