当前位置: 首页 > backend >正文

Spring之【AnnotatedBeanDefinitionReader】

目录

上一章回顾

前置知识

DefaultListableBeanFactory

beanDefinitionMap属性

beanDefinitionNames属性

registerBeanDefinition(String name, BeanDefinition beanDefinition)方法

AnnotationConfigUtils

部分常量

registerAnnotationConfigProcessors(BeanDefinitionRegistry registry, Object source)方法

BeanDefinitionReaderUtils

registerBeanDefinition(BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)方法

这里先简单说下部分内部组件Bean的作用

ConfigurationClassPostProcessor

AutowiredAnnotationBeanPostProcessor

CommonAnnotationBeanPostProcessor

AnnotatedBeanDefinitionReader

构造器

register(Class... componentClasses)方法

使用AnnotationConfigApplicationContext容器进行测试看下效果

自定义一个组件类

自定义一个实现了BeanDefinitionRegistryPostProcessor的组件类

编写测试类

运行结果

调试程序,看容器中的beanDefinitionMap集合 


上一章回顾

        主要讲述的是BeanDefinition,意为Bean的定义信息,记录了Bean是否为单例、是否懒加载等信息,Spring先将需要管理的Bean所对应的BeanDefinition信息存储起来,然后再进行后续操作,如:BeanFactoryPostProcessor的实例化和回调、Bean的实例化、BeanPostProcessor的before方法回调、Bean的初始化、BeanPostProcessor的after方法回调等。

前置知识

DefaultListableBeanFactory

beanDefinitionMap属性

// 用于存放容器中的Bean定义信息
// key:beanName
// value:BeanDefinition对象
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);

beanDefinitionNames属性

// bean名字的集合
private volatile List<String> beanDefinitionNames = new ArrayList<>(256);

registerBeanDefinition(String name, BeanDefinition beanDefinition)方法

/*** 对BeanDefinitionRegistry接口中的registerBeanDefinition方法的实现*/
@Override
public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)throws BeanDefinitionStoreException {// ...// 往容器中添加BeanDefinition信息this.beanDefinitionMap.put(beanName, beanDefinition);this.beanDefinitionNames.add(beanName);// ...
}

AnnotationConfigUtils

部分常量

// 容器内部组件Bean:ConfigurationClassPostProcessor的beanName
public static final String CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME ="org.springframework.context.annotation.internalConfigurationAnnotationProcessor";// 容器内部组件Bean:AutowiredAnnotationBeanPostProcessor的beanName
public static final String AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME ="org.springframework.context.annotation.internalAutowiredAnnotationProcessor";// 容器内部组件Bean:CommonAnnotationBeanPostProcessor的beanName
public static final String COMMON_ANNOTATION_PROCESSOR_BEAN_NAME ="org.springframework.context.annotation.internalCommonAnnotationProcessor";// 容器内部组件Bean:EventListenerMethodProcessor的beanName
public static final String EVENT_LISTENER_PROCESSOR_BEAN_NAME ="org.springframework.context.event.internalEventListenerProcessor";// 容器内部组件Bean:DefaultEventListenerFactory的beanName
public static final String EVENT_LISTENER_FACTORY_BEAN_NAME ="org.springframework.context.event.internalEventListenerFactory";

registerAnnotationConfigProcessors(BeanDefinitionRegistry registry, Object source)方法

public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(BeanDefinitionRegistry registry, @Nullable Object source) {// 获取DefaultListableBeanFactory对象DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<>(8);// 添加ConfigurationClassPostProcessor组件Bean的RootBeanDefinition到容器中if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);def.setSource(source);beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));}// 添加AutowiredAnnotationBeanPostProcessor组件Bean的RootBeanDefinition到容器中if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);def.setSource(source);beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));}// 添加CommonAnnotationBeanPostProcessor组件Bean的RootBeanDefinition到容器中if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);def.setSource(source);beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));}// 添加EventListenerMethodProcessor组件Bean的RootBeanDefinition到容器中if (!registry.containsBeanDefinition(EVENT_LISTENER_PROCESSOR_BEAN_NAME)) {RootBeanDefinition def = new RootBeanDefinition(EventListenerMethodProcessor.class);def.setSource(source);beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_PROCESSOR_BEAN_NAME));}// 添加DefaultEventListenerFactory组件Bean的RootBeanDefinition到容器中if (!registry.containsBeanDefinition(EVENT_LISTENER_FACTORY_BEAN_NAME)) {RootBeanDefinition def = new RootBeanDefinition(DefaultEventListenerFactory.class);def.setSource(source);beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME));}return beanDefs;
}// 这里的registry是DefaultListableBeanFactory
private static BeanDefinitionHolder registerPostProcessor(BeanDefinitionRegistry registry, RootBeanDefinition definition, String beanName) {// ...// 将BeanDefinition添加到容器中,也就是DefaultListableBeanFactory的beanDefinitionMap集合中registry.registerBeanDefinition(beanName, definition);// ...
}

BeanDefinitionReaderUtils

registerBeanDefinition(BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)方法

public abstract class BeanDefinitionReaderUtils {// ...public static void registerBeanDefinition(BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)throws BeanDefinitionStoreException {// 获取beanNameString beanName = definitionHolder.getBeanName();// 将BeanDefinition添加到Spring容器中registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition());// 处理bean的别名String[] aliases = definitionHolder.getAliases();if (aliases != null) {for (String alias : aliases) {registry.registerAlias(beanName, alias);}}}// ...
}

这里先简单说下部分内部组件Bean的作用

ConfigurationClassPostProcessor

  • 识别@ComponentScan注解
  • 识别@Component注解
  • 识别@Configuration注解
  • 识别@Bean注解
  • 识别@Import注解
  • ......

AutowiredAnnotationBeanPostProcessor

  • 识别@Autowired注解
  • 识别@Value注解
  • ......

CommonAnnotationBeanPostProcessor

  • 识别@Resource注解
  • 识别@PostConstruct注解
  • 识别@PreDestroy注解
  • ......

AnnotatedBeanDefinitionReader

构造器

public class AnnotatedBeanDefinitionReader {// ...// 参数可以理解为Spring容器public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry) {// 调用两个参数的构造器this(registry, getOrCreateEnvironment(registry));}public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) {// ...// 前置知识中提到的工具类AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);}// ...
}public abstract class AnnotationConfigUtils {// ...public static void registerAnnotationConfigProcessors(BeanDefinitionRegistry registry) {// 这里调用的是前置知识中提到的AnnotationConfigUtils类的方法// 将Spring内部需要的组件Bean的BeanDefinition信息存放到BeanDefinitionMap集合中registerAnnotationConfigProcessors(registry, null);}// ...
}

register(Class<?>... componentClasses)方法

public class AnnotatedBeanDefinitionReader {// ...// 可以传入多个用户定义的组件类public void register(Class<?>... componentClasses) {// 遍历传入的组件类for (Class<?> componentClass : componentClasses) {registerBean(componentClass);}}public void registerBean(Class<?> beanClass) {doRegisterBean(beanClass, null, null, null, null);}private <T> void doRegisterBean(Class<T> beanClass, @Nullable String name,@Nullable Class<? extends Annotation>[] qualifiers, @Nullable Supplier<T> supplier,@Nullable BeanDefinitionCustomizer[] customizers) {// 用户自定义的组件类对应创建AnnotatedGenericBeanDefinition对象AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(beanClass);// ...BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);// 使用前置知识中介绍的工具类添加BeanDefinition到Spring容器中BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);}// ...
}

使用AnnotationConfigApplicationContext容器进行测试看下效果

自定义一个组件类

package bean.definition.test;import org.springframework.context.annotation.ComponentScan;/*** 自定义的组件类,添加了@ComponentScan注解*/
@ComponentScan("bean.definition.test")
public class CustomComponent {
}

自定义一个实现了BeanDefinitionRegistryPostProcessor的组件类

package bean.definition.test;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.stereotype.Component;@Component
public class CustomBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {// 从容器中获取所有的BeanDefinition的beanNameString[] beanDefinitionNames = registry.getBeanDefinitionNames();// 遍历查看for (String beanDefinitionName : beanDefinitionNames) {System.out.println(beanDefinitionName);}}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {}
}

编写测试类

package bean.definition.test;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class SpringBeanDefinitionTest {public static void main(String[] args) {// 1、执行AnnotatedBeanDefinitionReader实例化// 2、执行ClassPathBeanDefinitionScanner实例化// 3、调用AnnotatedBeanDefinitionReader的register方法将传入的组件类的Bean定义对象添加到容器中// 4、执行AbstractApplicationContext的refresh方法new AnnotationConfigApplicationContext(CustomComponent.class);}
}

运行结果

// 5个Spring内部组件beanName(internal)
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory// 2个用户自定义组件beanName
customComponent
customBeanDefinitionRegistryPostProcessor

调试程序,看容器中的beanDefinitionMap集合 

http://www.xdnf.cn/news/15751.html

相关文章:

  • 针对大规模语言模型的上下文工程技术调研与总结(翻译并摘要)
  • 【C++】入门阶段
  • 基于开放API接口采集的定制开发开源AI智能名片S2B2C商城小程序数据整合与增长策略研究
  • 本地部署开源的 AI 驱动的搜索引擎 Perplexica 并实现外部访问
  • Spring Bean 的作用域(Bean Scope)
  • SpringAI_Chat模型_DeepSeek模型--基础对话
  • 扭蛋机系统开发:打造多元化娱乐生态的新引擎
  • Libevent(3)之使用教程(2)创建事件
  • Spring MVC @RequestParam注解全解析
  • 【Linux】重生之从零开始学习运维之Nginx之server小实践
  • 最新版vscode 连接ubuntu 18.04 保姆级教程
  • 编程实现Word自动排版:从理论到实践的全面指南
  • SurfaceView、TextureView、SurfaceTexture 和 GLSurfaceView
  • 【Android】ListView与RecyclerView的基础使用
  • 【unity游戏开发入门到精通——3D篇】3D光源之——unity使用Lens Flare (SRP) 组件实现太阳耀斑镜头光晕效果
  • C++实现单层时间轮
  • 4644电源管理芯片在微波射频组件中的技术优势与国产化实践
  • Linux驱动学习day24(UART子系统)
  • Ubuntu系统下快速体验iperf3工具(网络性能测试)
  • 嵌入式Linux:什么是线程?
  • 【RK3576】【Android14】开发环境搭建
  • Thread,ThreadLocal,ThreadLocalMap 三者的关系, 以及在实际开发中的应用【AI记录用】
  • 荷兰KIPP ZONEN CMP4 太阳辐射传感器耐热仪器设计高温日射计一种辐射计
  • 熔断和降*的区别
  • synchronized锁升级过程【AI笔记,仅供自己参考】
  • NIO网络通信基础
  • P1205 [USACO1.2] 方块转换 Transformations
  • 如何检查GitHub上可能潜在的信息泄漏
  • Vue3 Anime.js超级炫酷的网页动画库详解
  • NW983NW988美光固态闪存NW991NW992