【Spring容器的启动流程】

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关闭时,该事件被发布。该事件适用于在应用程序关闭时执行某些清理操作的应用程序。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis-Plus排除不必要的字段

查询学生信息排除年龄列表 📚🔍 使用MyBatis-Plus排除某些字段。如果你想要进行查询,但又不需要包含某些字段,那么这个功能将非常适合你。🔍🎓📝 1. 学生信息查询-排除年龄列表 在使用 MyBat…

【计算机网络】HTTP(下)

本文承接上文的代码进行改造,上文链接:HTTP上 文章目录 1. 实现网站跳转实现 自己的网站跳转 2. 请求方法(get) && 响应方法(post)GET方法POST方法GET与POST的应用场景 3. HTTP状态码在自己设计的代码中发现4043开头的状态码(重定向状态码)永久…

一种基于注意机制的快速、鲁棒的混合气体识别和浓度检测算法,配备了具有双损失函数的递归神经网络

A fast and robust mixture gases identification and concentration detection algorithm based on attention mechanism equipped recurrent neural network with double loss function 摘要 提出一个由注意力机制组成的电子鼻系统。首先采用端到端的编码器译码器&#xff…

容器编排学习(二)镜像制作和私有仓库介绍

一 Dockerfile 1 概述 commit的局限 很容易制作简单的镜像,但碰到复杂的情况就十分不方便例如碰到下面的情况需要设置默认的启动命令需要设置环境变量需要指定镜像开放某些特定的端口 Dockerfile就是解决这些问题的方法 Dockerfile是一种更强大的镜像制作方式…

VMware虚拟机+Centos7 配置静态,动态IP

本章目录 一、查看网关: 编辑–>虚拟网络编辑器二、点击NAT设置三、记住网关IP待会要用四、配置静态ip地址1、进入存放修改IP地址的目录2、修改ip地址的文件3、编辑文件4、文件(编辑好后退出) 五、重启网络六、测试1、linux上查看IP地址的…

爬虫爬取mp3文件例子

相信训练模型时数据集的获取也是一个很头疼的事情,搞cv领域的可以扛着摄像头架起三脚架拍摄获取(以前干过),但是如果是nlp领域的呢,特别是chatgpt等大模型出来后对这类文本等数据的需求更大,如果没有现成的…

【AIGC专题】Stable Diffusion 从入门到企业级实战0403

一、前言 本章是《Stable Diffusion 从入门到企业级实战》系列的第四部分能力进阶篇《Stable Diffusion ControlNet v1.1 图像精准控制》第03节, 利用Stable Diffusion ControlNet Canny模型精准控制图像生成。本部分内容,位于整个Stable Diffusion生态…

JavaScript 数组中常用的方法

添加 push:数组末尾添加unshift:数组首位添加splice(1, 0, ‘新增内容’):再指定位置插入,第二参数为0,表示新增;大于0,表示修改 删除 pop:删除末尾shift:删除首位slice(…

安全学习DAY23_CookieSessionToken

文章目录 Cookie和Session的区别Token的作用 Cookie和Session的区别 Cookie和Session都是用来在Web应用程序中跟踪用户状态的机制 1、存储位置不同: Cookie是存储在客户端(浏览器)上的,而Session是存储在服务器端的。 2、安全…

王道数据结构编程题 二叉树

二叉树定义 以下为本文解题代码的二叉树定义。 struct TreeNode {int val;TreeNode* left, *right;TreeNode(int val 0, TreeNode* left nullptr, TreeNode* right nullptr): val(val), left(left), right(right) {} };非递归后序遍历 题目描述 编写后序遍历二叉树的非递…

网络编程day6——基于C/S架构封装的线程池

一、线程竞争基本概念 竞争与同步 同一个进程中的线程共享进程中的绝大多数资源,当它们随意竞争时可能会导致资源被破坏、脏数据、不完整问题 通过一些手段让线程在竞争资源时相互协调、避免出现以上问题,这就称为线程同步 原子操作: 操作过程…

第16节-PhotoShop基础课程-修复工具组-去水印

文章目录 前言1.污点修复画笔1.功能原理2.调整1.调整大小 Alt 右键 左右2.调整软硬 Alt 右键 上下 2.修复画笔工具 Alt 选取源1.常规2.选择图案 3.修补工具1.类型1.源2.目标 2.扩展 4.内容感知移动工具5.红眼工具 前言 去水印等 1.污点修复画笔 比如把下面的土豆&#xff08…

Scrum敏捷模式的优势点、实践经验及适用企业

Scrum敏捷模式是一种灵活、适应性强的开发方法,其核心理念是以短周期、高频率的方式进行项目开发,确保团队能够快速响应变化。 Scrum包含三个角色:产品负责人(Product Owner)、Scrum Master和开发团队(Tea…

【程序员装机】Windows常见问题解决指南

文章目录 前言从专业版升级到企业版禁用Y空间的录制IDM扩展失效Edge浏览器安装CRX扩展 总结 前言 本文将介绍如何将Windows操作系统中的专业版升级为企业版,以及一些与系统和应用程序相关的常见问题的解决方法。 从专业版升级到企业版 如果您希望将专业版的Window…

【交叉熵损失torch.nn.CrossEntropyLoss详解-附代码实现】

CrossEntropyLoss 什么是交叉熵softmax损失计算验证CrossEntropyLoss 输入输出介绍验证代码 什么是交叉熵 交叉熵有很多文章介绍,此处不赘述。只需要知道它是可以衡量真实值和预测值之间的差距的,因而用交叉熵来计算损失的时候,损失是越小越…

详解TCP/IP协议第一篇:网络基础知识

文章目录 写给自己的话 一:前言 1:手握金刚钻的TCP/IP 2:计算机中的协议 3:分组

深入了解HTTP代理的工作原理

HTTP代理是一种常见的网络代理方式,它可以帮助用户隐藏自己的IP地址,保护个人隐私和安全。了解HTTP代理的工作原理对于使用HTTP代理的用户来说非常重要。本文将深入介绍HTTP代理的工作原理。 代理服务器的作用 HTTP代理的工作原理基于代理服务器的作用。…

Android常用的工具“小插件”——Widget机制

Widget俗称“小插件”,是Android系统中一个很常用的工具。比如我们可以在Launcher中添加一个音乐播放器的Widget。 在Launcher上可以添加插件,那么是不是说只有Launcher才具备这个功能呢? Android系统并没有具体规定谁才能充当“Widget容器…

2023年“羊城杯”网络安全大赛 Web方向题解wp 全

团队名称:ZhangSan 序号:11 不得不说今年本科组打的是真激烈,初出茅庐的小后生没见过这场面QAQ~ D0n’t pl4y g4m3!!! 简单记录一下,实际做题踩坑很多,尝试很多。 先扫了个目录,扫出start.sh 内容如下…

Linux CentOS7 系统中添加用户

在linux centOS7系统中,添加用户是管理员的基本操作。作为学习linux系统的基本操作,对添加用户应该多方面了解。 添加用户的命令useradd,跟上用户名,就可以快速创建一个用户。添加一些选项,可以设置更人性化的用户信息…