日报 2024-05-26

今日工作:

@Value,@Autowire相关源码

明日计划:

@Qualifier@Resource

日报 2024日报 2024-05-26

今日工作:

Conditional

将满足条件的Bean注册到容器中

使用场景:

  1. 需要在不同环境运行,读取不同的配置信息

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

今日工作:
  1. Configuration注解配置类加载过程
    1. AnnotationConfigApplicationContext使用包路径
    2. this 创建scanner reader
    3. doScan 扫描指定包
    4. scanCandidateComponents扫描候选类
    5. processCommonDefinitionAnnotations处理注解
    6. registerBeanDefinition 将beanName和BeanDefinition放入beanDefinitionMap和beanDefinitionNames
    7. registerAnnotationConfigProcessors注册所有相关注解后置处理器
    8. refresh刷新容器
    9. invokeBeanFactoryPostProcessors运行所有BFPP
    10. ConfigurationClassPostProcessor enhanceConfigurationClasses 增强配置类,使其可以对Bean方法进行拦截
  2. @Bean的解析过程
    1. 注册Bean
      1. processConfigBeanDefinitions
      2. parse
      3. doProcessConfigurationClass 配置类上注解的解析 会将Bean方法储存起来
      4. retrieveBeanMethodMetadata 检索bean方法
      5. loadBeanDefinitions 将配置类注册
      6. loadBeanDefinitionsForConfigurationClass 将配置类中的Bean注册
      7. loadBeanDefinitionsForBeanMethod
    2. 初始化
      1. 前面看过
    3. 销毁
明日计划:

获取Bean,@Import、

@PropertySource

日报 2024.5.20

1.1. 今日工作:

自定义标签解析过程

spring的bean工厂准备工作

spring BeanFactoryPostProcessor的执行过程

1.2. 明日计划:

spring BeanFactoryPostProcessor的执行过程

日报 2024.5.19

今日工作:
  1. spring配置文件的加载过程
  2. 解析xml文件并创建BeanDefinition的过程
明日计划:
  1. spring的bean工厂准备工作

日报 2024.5.18

今日工作:
  1. 对ClassPathXmlApplicationContext进行debug
    1. ClassPathXmlApplicationContext的父类ClassPathXmlApplicationContext``AbstractApplication初始化细节
    2. ClassPathXmlApplicationContext中的一些扩展点,如refresh方法中的initPropertySources方法可以设置必须配置
  2. StandardEnvironment初始化流程
    1. 调用无显示定义的无参构造方法,调用父类AbstractEnvironment构造方法 因为没有显示定义,所以要在父类构造方法处打断点,才能查看具体流程
    2. Environment=Property(配置)+Profile(环境)
  3. Java的初始化顺序规则
明日计划:
  1. spring的bean工厂准备工作

日报 2024.5.17

今日工作:
  1. spring 容器创建流程细节
    1. 找到abstractApplicationContext类中的refresh()方法,里面执行了十三个方法,是容器启动的具体操作
    2. 主要包括一些准备工作、增强器的实例化和注册、国际化、广播器和监听器的注册、Bean工厂的初始化
    3. Bean工厂的初始化最为复杂,有以下核心方法doGetBean``doCreateBean 等等
      1. doGetBean 用于获取和调用doCreateBean方法创建Bean。还会进行一些FactoryBean和解决循环依赖相关的操作。
      2. doCreateBean 用于实例化和初始化Bean对象,使用反射进行实例化后会依次调用填充属性、Aware接口方法、增强器方法、初始化方法。
  2. 循环依赖:Bean对象互相依赖
    1. 三级缓存
    2. @Lazy
  3. FactoryBean:doGetBean方法在创建Factorybean对象后会调用getObject
  4. jdk阅读环境搭建
明日计划:
  1. Spring的启动流程
  2. 找点jdk源码解析视频看看

日报 2024.5.16

今日工作:
  1. 成功搭建spring源码阅读环境:spring framework 5.3.21
  2. debug spring源码AbstractApplication类中的refresh方法,其中包含spring的核心启动流程

搭建源码环境遇到的坑:

下载spring tag 5.3.21 而不是分支5.3.x

tag是具体版本 分支是并行开发的支线

手动修改spring源码中的过时方法如 isAccessable()

其他坑是不必要的

明日计划:

将refresh中的13个方法细致掌握

日报 2024.5.11

今日工作:

实现依赖注入

【揭秘spring源码】01Spring从入门到放弃_哔哩哔哩_bilibilip11

史上最完整的AOP底层原理_哔哩哔哩_bilibili

深入理解Java8+JDK8源码及思想(完)_哔哩哔哩_bilibili

明日计划:

继续学习

日报 2024.5.11

今日工作:

Bean的实例化过程、Spring中的重要接口

【揭秘spring源码】01Spring从入门到放弃_哔哩哔哩_bilibilip9

史上最完整的AOP底层原理_哔哩哔哩_bilibili

深入理解Java8+JDK8源码及思想(完)_哔哩哔哩_bilibili

明日计划:

继续学习

日报 2024.5.10

今日工作:

Bean的实例化过程、Spring中的重要接口

明日计划:

继续学习

日报 2024.5.9

今日工作:

Bean的实例化过程

明日计划:

继续学习