【Spring容器的启动流程】

2023-11-04

Spring容器的启动流程主要分为以下几个步骤:

  1. 加载配置文件:Spring容器会从指定的配置文件中读取配置信息,包括bean的定义、依赖关系、AOP切面等。

  2. 创建容器:Spring容器启动后会创建一个容器实例,容器负责管理bean的生命周期和依赖关系。

  3. 扫描包并创建bean定义:Spring容器会扫描指定的包路径,自动创建包中标注了@Component、@Service、@Controller、@Repository等注解的类的bean定义。

  4. 解析依赖关系:Spring容器会根据bean定义中的依赖关系,自动将依赖的bean注入到需要的bean中。

  5. 初始化bean:容器会按照指定的顺序依次对bean进行初始化,包括实例化、属性注入、初始化方法执行等。

  6. 设置代理对象:如果bean需要被AOP切面增强,则容器会为其创建代理对象。

  7. 完成容器初始化:所有bean初始化完成后,Spring容器启动完成。

在实际开发中,Spring容器的启动可以通过多种方式来实现,包括XML配置和注解配置等。其中XML配置主要通过applicationContext.xml文件来实现,这个配置文件中,告诉Spring容器要创建的bean的名称和类名,这样就可以在Spring容器中实例化这个类,并将其作为一个bean注册到Spring容器中。

除了XML配置之外,注解配置也是一种很常见的配置方式。在Java代码中,我们可以通过在类、字段、方法上添加一些特定的注解来告诉Spring容器如何创建和管理Bean对象。常见的注解包括@Component、@Service、@Controller、@Repository等。

启动Spring容器,首先需要创建一个ApplicationContext对象。这个对象是Spring框架的核心,负责管理所有的Bean对象,以及解决它们之间的依赖关系。ApplicationContext对象可以通过多种方式来创建。一般情况下,我们可以通过ClassPathXmlApplicationContext或AnnotationConfigApplicationContext类来创建一个ApplicationContext对象。其中ClassPathXmlApplicationContext类用于XML配置文件,AnnotationConfigApplicationContext用于注解配置。

一旦配置文件准备好了,就可以开始启动Spring容器了。为了启动容器,需要使用ApplicationContext接口的一个实现类。在这个实现类中,有一个非常重要的方法叫做refresh(),它会触发Spring框架开始加载和初始化所有的Bean对象。

refresh()方法是Spring框架启动过程中的核心方法。首先,refresh()方法会创建一个BeanFactory,这个BeanFactory是一个Bean工厂,是Spring框架中提供的一种对象创建和管理机制。BeanFactory会读取配置文件,通过反射机制实例化对应的Bean,然后将Bean注册到容器中。

接下来,refresh()方法会启动各种后置处理器PostProcessor,后置处理器是一种回调函数,它可以在Bean实例化、初始化之前或之后进行操作,比如修改Bean属性、替换Bean对象等。Spring框架中有很多内置的后置处理器。

比如AutowiredAnnotationBeanPostProcessor用于处理@Autowired和@Inject注解。它会在bean实例化后递归的处理bean的属性,并根据属性上的注解来自动装配依赖。
CommonAnnotationBeanPostProcessor用于处理JSR-250规范的注解,包括@Resource、@PostConstruct和@PreDestroy。
InitDestroyAnnotationBeanPostProcessor用于处理@PostConstruct和@PreDestroy注解,它会在bean的初始化和销毁阶段对相应的方法进行回调。

在执行了后置处理器之后,refresh()方法会执行BeanFactory的预实例化单例Bean,这个过程会通过调用getBean()方法来获取Bean实例。在这个过程中,如果Bean实现了InitializingBean接口,那么Spring容器会调用它的afterPropertiesSet()方法来完成Bean的初始化。如果Bean配置了init-method,那么Spring容器也会调用它指定的初始化方法。

最后,refresh()方法会发布上下文事件,这些事件会被注册到各种事件监听器中,用于监控和管理容器生命周期中的各个阶段。Spring框架中有很多内置的事件,这些事件可以在Spring应用程序上下文中定义的Bean中使用,以便在特定生命周期事件发生时执行特定的代码。例如,可以使用这些事件来处理数据源连接、缓存清除、应用程序状态检查等应用程序行为。

比如ContextRefreshedEvent:当ApplicationContext被初始化或刷新时,该事件被发布。该事件适用于需要在启动时执行某些操作的应用程序。
ContextStartedEvent:该事件表示ApplicationContext已启动,用于在应用程序启动后执行某些操作,例如在spring boot应用程序中启动一个后台线程。
ContextStoppedEvent:当ApplicationContext停止时,该事件被发布。该事件适用于在应用程序停止时执行某些清理操作的应用程序。
ContextClosedEvent:当ApplicationContext关闭时,该事件被发布。该事件适用于在应用程序关闭时执行某些清理操作的应用程序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Spring容器的启动流程】 的相关文章

随机推荐

  • Java中 判断集合中的元素相等的依据 详细解析

    我们经常使用的集合如ArrayList LinkedList Vector 你在调用contains 方法的时候 或者是你在根据对象移除元素 remove Object o 你知道他们是如何判断集合中的元素是否 是相等的吗 接下来我们跟着源
  • 解决Linux MySQL报错ERROR 2002

    在Linux安装MySQL有时候会出现 mysql ERROR 2002 HY000 Can t connect to local MySQL server through socket var lib mysql mysql sock 2
  • Fority代码审计工具介绍

    Fortify SCA简介 Fortify SCA 是一个静态的 白盒的软件源代码安全测试工具 它通过内置的五大主要分析引擎 数据流 语义 结构 控制流 配置流等对应用软件的源代码进行静态的分析 分析的过程中与它特有的软件安全漏洞规则集进行
  • 速度教你创建网页文件,实现HTML入门

    今天 为大家准备了关于创建网页文件的学习内容 具体包括网页文件创建 HTML标签语法规范 HTML标签的关系以及HTML整体结构 完成以上内容的学习 零基础学习者基本上就能学会如何创建一个有简单内容的网页文件 快一起来看吧 1 网页文件的扩
  • Java常用包

    Java采用包结构来组织和管理类和接口文件 一 java lang包 该包提供了Java语言进行程序设计的基础类 它是默认导入的包 该包里面的Runnable接口和Object Math String StringBuffer System
  • Python中使用zlib库实现字符串的压缩和解压缩是一种常见的操作

    Python中使用zlib库实现字符串的压缩和解压缩是一种常见的操作 zlib库提供了一组函数 可以方便地对字符串进行压缩和解压缩操作 下面是一个详细的示例 展示了如何使用zlib库进行字符串的压缩和解压缩 首先 我们需要导入zlib库 i
  • C++模板的使用

    在平时的工作和学习过程中 经常会用到泛型 这里对泛型和模板进行一下梳理 以便理解和使用 模板关键字 template 为什么要使用模板 假如设计一个两个参数的函数 用来求两个对象的乘积 在实践中我们可能需要定义n多个函数 int multi
  • ETCD v3 restful api 使用详解

    ETCD v3 restful api 使用详解 网上已经有很多关于v2接口的使用了 类型下面的请求方式 本文就主要讲解v3版本的restful api的使用方式 V2版本 curl http 127 0 0 1 2379 v2 keys
  • C++语言基础--递归函数

    对于很多编程初学者来说 递归算法是学习语言的最大障碍之一 可能也有一大部分人知道递归 也能看的懂递归 但在实际做题过程中 却不知道怎么使用 递归的定义 1 很官方的说法 递归 在数学与计算机科学中 是指在函数的定义中使用函数自身的方法 也就
  • 机器学习集成模型学习——Boosting集成学习(四)

    Boosting Boosting模型是线性训练的 后面的模型会纠结于前一个模型预测错的部分 然后尝试把它修正 步骤如下 第一个模型用一部分训练集训练 得出这部分训练集上的错误点 错误的数据会有更大的概率被后续的模型选择 第二个模型再拿一部
  • Unbiased Teacher v2: Semi-supervised Object Detection for Anchor-free and Anchor-based Detectors

    摘要 随着最近半监督目标检测 SS OD 技术的发展 目标检测器可以通过使用有限的标记数据和丰富的未标记数据来改进 然而 仍有两个挑战没有解决 1 在无锚检测器上没有先期的SS OD工作 2 在伪标签边界框回归时 先期工作是无效的 在本文中
  • webpack学习

    前端工程化具体的解决方案 webpack 1 新建项目空白目录 文件夹地址栏cmd运行 npm init y 初始化包管理配置文件package json 2 新建src源代码目录 3 src下新建index html和index js 4
  • Java --- 堆空间大小设置与OutOfMemoryError(OOM)

    目录 一 堆空间大小设置 二 OutOfMemoryError异常 一 堆空间大小设置 1 Java堆区用于存储Java对象实例 那么堆的大小在JVM启动时就已经设定好了 大家可以通过选项 Xmx 和 Xms 来进行设置 Xms 用于表示堆
  • gorm的全部标签说明

    在 GORM 中 可以使用多种标签来控制模型结构体的行为和数据库列的属性 以下是一些常用的 GORM 标签 primaryKey 将字段设置为模型的主键 autoIncrement 将字段设置为自增长字段 unique 将字段设置为唯一的
  • Filter链,FilterConfig接口,Filter实现用户自动登录

    一 Filter链 在一个 Web 应用程序中可以注册多个 Filter 程序 每个 Filter 程序都可以针对某一个 URL 进行拦截 如果多个 Filter 程序都对同一个 URL 进行拦截 那么这些 Filter 就会组成一个 Fi
  • mongodb replica初始化

    use admin cfg id audit members id 0 host 10 96 91 192 17017 priority 2 id 1 host 10 96 91 192 27017 priority 1 id 2 host
  • VSCode中JS脚本的运行(控制台输出配置)

    F5开始调试 进入launch json中进行如下配置 使用 IntelliSense 了解相关属性 悬停以查看现有属性的描述 欲了解更多信息 请访问 https go microsoft com fwlink linkid 830387
  • node版本降级

    问题原因 因为node版本过高 导致npm install 或npm run dev报错 1 安装node版本管理模块 n sudo npm install n g 2 根据自己需要的安装版本 例如 安装稳定版本 sudo n stable
  • 设计模式之抽象工厂

    抽象工厂模式结构图 抽象工厂模式 提供一个创建一系列相关或相互依赖对象的接口 而无需指定它们具体的类 工厂方法模式 定义一个用于创建对象的接口 让子类决定实例化哪一个类 抽象工厂模式是围绕一个超级工厂创建其他工厂 该超级工程又称为其他工厂的
  • 【Spring容器的启动流程】

    Spring容器的启动流程主要分为以下几个步骤 加载配置文件 Spring容器会从指定的配置文件中读取配置信息 包括bean的定义 依赖关系 AOP切面等 创建容器 Spring容器启动后会创建一个容器实例 容器负责管理bean的生命周期和