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

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.dtcms.com/a/287314.html

相关文章:

  • Django母婴商城项目实践(十一)- 用户信息模块之用户登录注册
  • 【vue-5】Vue 3 中的 v-model:双向数据绑定的全面指南
  • 基于Python的口腔正畸健康教育聊天机器人开发与评估研究
  • XSS漏洞学习总结
  • 【Linux】基本指令详解(三) 指令本质、三个查找指令、打包压缩、重要热键、linux体系结构、命令行解释器
  • 数据结构 队列
  • 《计算机网络》实验报告二 IP协议分析
  • 在摄像机视图中想像在普通 3D 视口里那样随意移动
  • ROS2 通过相机确定物品坐标位置
  • 【Git】报错:git config --global http.sslBackend “openssl“
  • Java Map 常用方法大全
  • 鸿蒙蓝牙通信
  • 高压电工作业证考试核心考点:电气安全基础篇
  • 异世界历险之数据结构世界(二叉树-leetcode)
  • 开发框架安全ThinkPHPLaravelSpringBootStruts2SpringCloud复现
  • 中间件安全攻防全解:从Tomcat到Weblogic反序列化漏洞介绍
  • 【Oracle】ORACLE OMF说明
  • windows 如何安装 wsl ubuntu
  • PostgreSQL 语法详解
  • Kubernetes常用命令总结
  • 突破研究边界!探索OpenAI o3与o4-mini模型的无限可能
  • Leetcode 05 java
  • Uniapp之自定义图片预览
  • CSS面试题及详细答案140道之(81-100)
  • 深度学习图像分类数据集—六十种植物病害分类
  • 微信小程序171~180
  • 嵌入式硬件中电感的基本原理与实现详解
  • 六种经典排序算法:从原理到 Java 实现
  • LVS的简介以及架构
  • 闲庭信步使用图像验证平台加速FPGA的开发:第二十四课——图像直方图和RGB图像叠加的FPGA实现