日报 2024-05-26
今日工作:
@Value,@Autowire相关源码
明日计划:
@Qualifier@Resource
日报 2024日报 2024-05-26
今日工作:
Conditional
将满足条件的Bean注册到容器中
使用场景:
- 需要在不同环境运行,读取不同的配置信息
ConditionEvaluator 评估是否符合条件 shouldSkip
ConfigurationClassParser processConfigurationClass 中使用shouldSkip跳过配置类
@Lazy
优化启动性能
AbstractApplicationContext preInstantiateSingletons 在此时Lazy没有被实例化
@Component
将自己创建的类注入到IOC容器中
AnnotationConfigUtils.processCommonDefinitionAnnotations(abd) 处理以下注解:@Lazy、@Primary、@DependsOn、@Role、@Description 这些注解将会被设置到元数据中
ConfigurationClassParser doProcessConfigurationClass 处理以下注解:@PropertySource、@ComponentScan、@Import、@ImportResource、@Bean、default方法、配置类的父类
ConfgurationClassPostProcessor processConfigBeanDefinitions
ConfigurationPhase 也就是PARSE_CONFIGURATION阶段会忽略配置类,REGISTER_BEAN阶段忽略普通类
ClassPathBeanDefinitinScanner doScan 扫描指定包
ClassPathScanningCandidateComponentProvider addCandidateComponentsFromIndex 使用componentsIndex加载组件类 scanCandidateComponents直接扫描指定包加载组件类
componentsIndex的加载过程涉及读取由构建工具(如Maven或Gradle)生成的类路径索引文件(通常是META-INF/spring.components)
@Value
AbstractAutowireCapableBeanFactory
populateBean 填充属性
initializeBean 初始化Bean 执行Aware接口、执行BeanPostProcessor:Before、执行初始化方法、BeanPostProcessor:After
今日收获:
明日计划:
-05-24
今日工作:
@PropertySource
加载配置文件,将配置文件放到环境变量中
PropertySourceRegistry processPropertySource
DefaultPropertySourceFactory 加载配置文件 createPropertySource
PropertiesPropertySource 封装Properties作为属性源
PropertySourceProcessor 属性源处理 addPropertySource
@ComponentScans
扫描对应包下标注@Component注解、@Configuration注解等等注解的类。
@ComponentScan 注解用于指定 Spring 扫描组件的范围。
ComponentScanAnnotationParser 解析@ComponentScan注解 parse
ClassPathBeanDefinitionScanner 扫描类路径下的Bean定义,注册到容器 registerBeanDefinition
ClassPathScanningCandidateComponentProvider 在类路径下扫描
@DependsOn
指定当前Bean对象所依赖的其他Bean对象
可以改变实例化顺序
AnnotatedBeanDefinitionReader (读取和解析配置类)和 ClassPathBeanDefinitionScanner (扫描包下的类)都是 Spring Framework 中用于注册 Bean 定义的类
注册Bean
AnnotatedBeanDefinitionReader doRegisterBean 从注解中读取元数据设置到BeanDefinition中,在注册到容器中
BeanDefinition 接口:管理Bean属性和元数据
调用后置处理器
明日计划:
@Conditional、@Lazy@Component
日报 2024.5.22
今日工作:
ImportSelector 用于组合配置类 ImportBeanDefinitionRegistrar用于加载Bean定义
BeanFactoryPostProcessor 在Bean定义加载后进行修改
BeanDefinitionRegistryPostProcessor 动态注册新的Bean定义火大规模修改Bean定义 在其他BeanFactoryPostProcessor之前执行
ConfigurationClassPostProcessor 解析处理类及其注解 proessConfigBeanDefinitions postProcessBeanDefinitionRegistry processConfigBeanDefinitions
ConfigurationClassParser 配置类解析器 doProcessConfigurationClass parse processImports处理Impot注解
ImportSelector selectImports 获取想要注入的类的类名 需要自己实现
将配置类解析为ConfigurationClass
ConfigurationClassBeanDefinitionReader 读取ConfigurationClass类,注册其中的Bean定义 loadBeanDefinitions
AnnotationMetadata 带有注解的类的元数据
DefaultListableBeanFactory 实现BeanDefinitionRegistry注册储存Bean定义的功能。实现BeanFactory获取Bean的功能
DefaultSingletonBeanRegistry 储存单例对象
1.2. 明日计划:
property Source dependson conditional注解
日报 2024.5.22
今日工作:
AbstractApplicationContext 通用上下文实现 invokeBeanFactoryPostProcessors
PostProcessorRegistrationDelegate 处理和和注册后置处理器 invokeBeanFactoryPostProcessors
AbstractBeanFactory 创建和缓存Bean doGetBean
DefaultSingletonBeanRegistry 管理单例 bean getSingleton
AbstractAutowireCapableBeanFactory 用于默认Bean创建 createBean doCreateBean createBeanInstance instantiateBean
SimpleInstantiationStrategy 用于 BeanFactory 的简单对象实例化策略 instantiate
BeanUtil instantiateClass
@Import
注解使用场景:配置较多,使用import进行分类管理。引入第三方类。
ImportSelector ImportBeanDefinitionRegistrar
BeanFactoryPostProcessor 在Bean定义加载后进行修改
BeanDefinitionRegistryPostProcessor 动态注册新的Bean定义火大规模修改Bean定义 在所有Bean
1.2. 明日计划:
property Source dependson conditional注解
日报 2024.5.21
今日工作:
- Configuration注解配置类加载过程
AnnotationConfigApplicationContext
使用包路径- this 创建scanner reader
- doScan 扫描指定包
- scanCandidateComponents扫描候选类
- processCommonDefinitionAnnotations处理注解
- registerBeanDefinition 将beanName和BeanDefinition放入beanDefinitionMap和beanDefinitionNames
- registerAnnotationConfigProcessors注册所有相关注解后置处理器
- refresh刷新容器
- invokeBeanFactoryPostProcessors运行所有BFPP
- ConfigurationClassPostProcessor enhanceConfigurationClasses 增强配置类,使其可以对Bean方法进行拦截
- @Bean的解析过程
- 注册Bean
- processConfigBeanDefinitions
- parse
- doProcessConfigurationClass 配置类上注解的解析 会将Bean方法储存起来
- retrieveBeanMethodMetadata 检索bean方法
- loadBeanDefinitions 将配置类注册
- loadBeanDefinitionsForConfigurationClass 将配置类中的Bean注册
- loadBeanDefinitionsForBeanMethod
- 初始化
- 前面看过
- 销毁
- 注册Bean
明日计划:
获取Bean,@Import、
@PropertySource
日报 2024.5.20
1.1. 今日工作:
自定义标签解析过程
spring的bean工厂准备工作
spring BeanFactoryPostProcessor的执行过程
1.2. 明日计划:
spring BeanFactoryPostProcessor的执行过程
日报 2024.5.19
今日工作:
- spring配置文件的加载过程
- 解析xml文件并创建BeanDefinition的过程
明日计划:
- spring的bean工厂准备工作
日报 2024.5.18
今日工作:
- 对ClassPathXmlApplicationContext进行debug
- ClassPathXmlApplicationContext的父类
ClassPathXmlApplicationContext``AbstractApplication
初始化细节 - ClassPathXmlApplicationContext中的一些扩展点,如refresh方法中的
initPropertySources
方法可以设置必须配置
- ClassPathXmlApplicationContext的父类
- StandardEnvironment初始化流程
- 调用无显示定义的无参构造方法,调用父类
AbstractEnvironment
构造方法 因为没有显示定义,所以要在父类构造方法处打断点,才能查看具体流程 - Environment=Property(配置)+Profile(环境)
- 调用无显示定义的无参构造方法,调用父类
- Java的初始化顺序规则
明日计划:
- spring的bean工厂准备工作
日报 2024.5.17
今日工作:
- spring 容器创建流程细节
- 找到abstractApplicationContext类中的refresh()方法,里面执行了十三个方法,是容器启动的具体操作
- 主要包括一些准备工作、增强器的实例化和注册、国际化、广播器和监听器的注册、Bean工厂的初始化
- Bean工厂的初始化最为复杂,有以下核心方法
doGetBean``doCreateBean
等等- doGetBean 用于获取和调用
doCreateBean
方法创建Bean。还会进行一些FactoryBean
和解决循环依赖相关的操作。 - doCreateBean 用于实例化和初始化Bean对象,使用反射进行实例化后会依次调用填充属性、Aware接口方法、增强器方法、初始化方法。
- doGetBean 用于获取和调用
- 循环依赖:Bean对象互相依赖
- 三级缓存
- @Lazy
- FactoryBean:doGetBean方法在创建
Factorybean
对象后会调用getObject
- jdk阅读环境搭建
明日计划:
- Spring的启动流程
- 找点jdk源码解析视频看看
日报 2024.5.16
今日工作:
- 成功搭建spring源码阅读环境:spring framework 5.3.21
- debug spring源码AbstractApplication类中的refresh方法,其中包含spring的核心启动流程
搭建源码环境遇到的坑:
下载spring tag 5.3.21 而不是分支5.3.x
tag是具体版本 分支是并行开发的支线
手动修改spring源码中的过时方法如 isAccessable()
其他坑是不必要的
明日计划:
将refresh中的13个方法细致掌握
日报 2024.5.11
今日工作:
实现依赖注入
【揭秘spring源码】01Spring从入门到放弃_哔哩哔哩_bilibilip11
深入理解Java8+JDK8源码及思想(完)_哔哩哔哩_bilibili
明日计划:
继续学习
日报 2024.5.11
今日工作:
Bean的实例化过程、Spring中的重要接口
【揭秘spring源码】01Spring从入门到放弃_哔哩哔哩_bilibilip9
深入理解Java8+JDK8源码及思想(完)_哔哩哔哩_bilibili
明日计划:
继续学习
日报 2024.5.10
今日工作:
Bean的实例化过程、Spring中的重要接口
明日计划:
继续学习
日报 2024.5.9
今日工作:
Bean的实例化过程
明日计划:
继续学习