Spring启动流程

news/2024/9/29 5:35:12

本文基于AnnotationConfigApplicationContext的方式启动,解析Spring启动的流程
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);

一、构造方法

容器启动需要扫描BD(BeanDefinition),并创建BD,Spring将这两个功能分成了两个类,分别是

  • AnnotatedBeanDefinitionReader,BD阅读器,用于根据Bean的元信息(比如类名、注解信息)创建BD
  • ClassPathBeanDefinitionScanner,BD扫描器,用于根据指定路径扫描出符合条件的BD


this()构造方法中有两个关键方法

  1. this.reader = new AnnotatedBeanDefinitionReader(this); 创建一个BD(BeanDefinition)阅读器
    该构造方法需要传递一个BeanDefinitionRegistry注册器对象进去,我们可以看到这个注册器对象就是ApplicationContext本身

接着往下看,重点方法
image
这个方法是将spring内置的一些PostProcessor注册为BD
image
一共有6个内置的beanFactoryPostProcessor

  • ConfigurationClassPostProcessor
  • AutowiredAnnotationBeanPostProcessor
  • CommonAnnotationBeanPostProcessor(当项目中存在JSR250,即javax.annotation.Resource注解)
  • PersistenceAnnotationBeanPostProcessor(当项目使用JPA)
  • EventListenerMethodProcessor
  • DefaultEventListenerFactory(这个比较特殊,不是beanFactoryPostProcessor)

registerPostProcessor方法只需要关注将PostProcessor注册为BD,简单理解为加入到DefaultListableBeanFactory中的beanDefinitionMap中。

  1. this.scanner = new ClassPathBeanDefinitionScanner(this);为给定的BeanFactory创建一个scanner

在scanner的构造方法中注册了一个默认的Filter,作用是包含所有@Component注解的类

image

二、register方法,将启动类注册为BD

使用上文new出的AnnotatedBeanDefinitionReader将启动类class
简单理解为解析类上的注解等元信息,并注册为BD

三、refresh方法

prepareBeanFactory方法

添加BeanPostProcessor:

  • ApplicationContextAwareProcessor
  • ApplicationListenerDetector

invokeBeanFactoryPostProcessors方法,执行BeanFactoryPostProcessor方法

PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors方法
将BeanFactoryPostProcessor分为两种,
一种是常规类型,还有一种是BeanDefinitionRegistryPostProcessor

  1. 执行所有内部的BeanDefinitionRegistryPostProcessor。
  2. 将容器中的所有BeanDefinitionRegistryPostProcessor根据BD创建出Bean(提前实例化)
    此时容器内部一般只有ConfigurationClassPostProcessor
  3. 执行容器中BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法
    实际上->执行ConfigurationClassPostProcessor

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/30112.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Sychronized和ReentrantLock有哪些不同点

`synchronized` 和 `ReentrantLock` 是 Java 中用于实现线程同步的两种机制,它们之间存在多方面的不同,主要体现在以下几点: 1. 用法上的差异: - `synchronized` 是 Java 的关键字,可以直接用于方法或代码块。对于方法,可以同步整个方法;对于代码块,可以更细粒度地控…

AutoCAD .NET framework支持情况

出处 https://forums.autodesk.com/t5/net/net-framework-support/m-p/9403930 问题描述 我想问一下是否有一些官方表格.Net framework支持。有人有关于支持.NET 5的信息/经验吗? 回答1(03-27-2020)附加了一个用于AutoCAD/Visual Sudio兼容性的非官方表格。 我没有测试,但是…

hj_podman_20240510

略创建文件夹&容器停止&删除 yum install podman yum update / apt-get update # podman exec -u 0 -it a4a89d953992 /bin/bash 这是root账户进入 -u 0~~~# mysql 8.0.37 podman pull mysql:8.0.37 mkdir -p /home/hj/hj_mysql8.0.37_3307 cd /home/hj/hj_mysql8.0.…

开源EEG脑电图参考设计+信用卡大小、USB供电的4象限源测量单元

1、ESP-BLE-MESH - 乐鑫开源的蓝牙 mesh 协议栈 ESP-BLE-MESH 是乐鑫开源的蓝牙 mesh 协议栈,已通过蓝牙技术联盟 (SIG) 全功能认证,支持 Bluetooth Mesh Specification v1.0.1 中规定的所有功能与应用模型。使用 ESP-BLE-MESH 技术,可以和全球不同厂商、不同类型的标准蓝牙…

使用vue ui新建一个vue项目

参考:https://blog.csdn.net/weixin_46932840/article/details/114590107@目录一、安装环境二、使用vue ui初始化步骤1.我的是到C盘的Program Files\nodejs\node_global目录下执行以下命令2.执行命令后会自动跳转到初始化项目的页面,如下图操作3.最后我一开始执行npm run ser…

《最新出炉》系列入门篇-Python+Playwright自动化测试-46-鼠标滚轮操作

1.简介 有些网站为了节省流量和资源,提高加载效率,采用的是动态加载(懒加载)的,也就是当拖动页面右侧滚动条后会自动加载网页下面的内容,不拖动就不会加载的或者通过鼠标滚轮操作。 2.wheel模拟鼠标滚动 wheel模拟鼠标滚动,就是通过调度一个wheel事件。(滚轮事件如果不…

面向单片机的超轻量级的神经网络推理库+单片机上实现动态加载功能的函数库

1、TinyMaix - 面向单片机的超轻量级的神经网络推理库 TinyMaix 是专为低资源的单片机设计的 AI 神经网络推理框架,通常被称为 TinyML。TinyMaix 可以让你在任意单片机上运行轻量级深度学习模型。TinyMaix 的设计原则:易用性 > 移植性 > 速度 > 空间。 TinyMaix 其实…

1 浏览器生成消息

目录1 生成http请求消息1 生成http请求消息 URI:统一资源标识符 Uniform Resource Identifier URL:统一资源定位符 Uniform Resource Locator http的基本思路http消息的格式由于每条请求消息中只能写 1 个 URI,所以每次只能获取 1 个文件,如果需要获取多个文件,必须对每个…