Spring 容器--如何创建和加载一个 Spring 容器?

akamai3简单分析 akamai流程的简单分析 阅读详情

在基于 Spring 的应用中,你的应用对象生存于 Spring 容器中。

容器是 Spring 框架的核心。Spring 容器使用 DI 管理构成应用的组件,它会创建相互协作的组件之间的关联。

Q:Spring 容器主要负责什么?
A:Spring 容器负责创建对象,装配它们,配置它们并管理它们的整个生命周期,从生存到死亡。

Q:Spring自带了哪些容器实现?
A:第一类:bean 工厂是最简单的容器,提供基本的 DI 支持;第二类:应用上下文基于 BeanFactory 构建,并提供应用框架级别的服务。

Q:选择哪一类容器实现?
A:应用上下文。因为 bean 工厂对大多数应用来说往往太低级了,因此,应用上下文要比 bean 工厂更受欢迎。


2.1 使用应用上下文

Spring 自带了多种类型的应用上下文。

  • AnnotationConfigApplicationContext:从一个或多个基于 Java 的配置类中加载 Spring 应用上下文。
  • AnnotationConfigWebApplicationContext:从一个或多个基于 Java 的配置类中加载 Spring Web 应用上下文。
  • ClassPathXmlApplicationContext:从类路径下的一个或多个 XML 配置文件中加载上下文定义,把应用上下文的定义文件作为类资源。
  • FileSystemXmlapplicationcontext:从文件系统下的一个或多个 XML 配置文件中加载上下文定义。
  • XmlWebApplicationContext:从 Web 应用下的一个或多个 XML 配置文件中加载上下文定义。

如何使用?

// 从指定的文件系统路径下,查找 knight.xml 文件
ApplicationContext context = new FileSystemXmlApplicationContext("d:/knight.xml");

// 使用 ClassPathXmlApplicationContext 从应用的类路径下加载应用上下文
ApplicationContext context = new ClassPathXmlApplicationContext("knight.xml");

// 从 Java 配置中加载应用上下文
ApplicationContext context = new AnnotationConfigApplicationContext(com.springinaction.knights.config.KnightConfig.class);

2.2 bean 的生命周期

bean 装载到 Spring 应用上下文中的一个典型的生命周期过程。
这里写图片描述

下面进行详细描述:

  1. Spring 对 bean 进行实例化;
  2. Spring 将值和 bean 的引用注入到 bean 对应的属性中;
  3. 如果 bean 实现了 BeanNameAware 接口,Spring 将 bean 的 ID 传递给 setBeanName()方法
  4. 如果 bean 实现了 BeanFactoryAware 接口,Spring 将调用 setBeanFactory()方法,将 BeanFactory 容器实例传入;
  5. 如果 bean 实现了 ApplicationContextAware 接口,Spring 将调用 setApplicationContext()方法,将 bean 所在的应用上下文的引用传入进来;
  6. 如果 bean 实现了 BeanPostProcessor 接口,Spring 将调用它们的 postProcessBeforeInitialization()方法;
  7. 如果 bean 实现了 InitializingBean 接口,Spring 将调用它们的 afterPropertiesSet()方法。类似地,如果 bean 使用 initmethod 声明了初始化方法,该方法也会被调用;
  8. 如果 bean 实现了 BeanPostProcessor 接口,Spring 将调用它们的 postProcessAfterInitialization()方法;
  9. 此时,bean 已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,知道该应用上下文被销毁;
  10. 如果 bean 实现了 DisposableBean 接口,Spring 将调用它的 destory() 接口方法。同样,如果 bean 使用 destroymethod 声明了销毁方法,该方法也会被调用。

上一篇: Spring 是如何简化 Java 开发的?
下一篇:Spring 模块和 Spring Portfolio

【WLAN】【调试】再谈如何使用Wireshark解密WiFi数据包——使用TK信息 - 本文介绍了一种wireshark使用TK信息解密空口报文的方式,该方式对是否有关联过程的报文没有要求。 阅读详情

相关推荐

电源新手别怕!手把手教你搞定Buck电路的环路补偿(附Type II/III补偿器参数计算)

本文为电源设计新手详细解析Buck电路环路补偿技术,重点介绍Type II和Type III补偿器的参数计算与设计方法。通过实例演示和实用技巧,帮助工程师快速掌握环路补偿原理,解决电源振荡、响应慢等问题,提升电路稳定性与性能。

weixin_30607029的博客 619

spring容器加载过程

一、封装配置文件 spring的配置文件读取是通过ClassPathResource进行封装的。ClassPathResource类是简介实现了接口Resource,而Resource的作用是为了封装所有spring内部使用到的底层资源:File,URL,ClassPath等。Resource接口的定义如下: spring的配置文件读取是通过ClassPathResource进行封装的。C...

CCCCC_SSSSS的博客 2671

从噪声中提取真相:LabVIEW振动信号积分处理的降噪艺术

本文深入探讨了LabVIEW在振动信号积分处理中的降噪技术,揭示了如何通过选择性频率加权从噪声中提取关键故障特征。详细介绍了时域和频域积分方法的实现原理及优化策略,并结合工业案例展示了多轴信号联合降噪的实际应用效果,为设备状态监测提供了高效解决方案。

weixin_29164185的博客 303

Spring的加载过程

Spring提供了IOC(控制反转)和AOP(面向切面编程)基本功能,解决企业应用开发的复杂性的一个开源框架。其核心组件包括core、context、bean。 启动过程 在一个基于springmvc的web应用中,需要有一个web容器,一般我们用tomacat,这个web容器提供了一个全局的上下文环境ServletContext,同时也是Spring IoC容器的宿主环境。 宿主容器启动时,其入口文件便是web.xml。web.xml需要定义两个最基本的内容,ContextLoaderListener和D

m0_67402341的博客 491

Cadence OrCAD常见引脚错误排查指南:从原理图到封装的完整解决方案

本文详细解析Cadence OrCAD设计中常见的引脚错误问题,提供从原理图到封装的系统化解决方案。涵盖错误诊断、元件库修复、封装管理及自动化处理技巧,帮助工程师高效解决ORCAP-36022等典型错误,确保设计流程顺畅。

weixin_29294975的博客 256

pwscf与wannier90 Hands-On实战训练(一)——费米面计算为例

系列文章目录 Quantum Espresso Hands-On实战训练(三)——DOS计算 文章目录系列文章目录计算过程pwscf直接得到等能面pwscf和wannier90得到等能面pwscf直接得到等能面1. scf2. nscf3. 后处理pwscf和wannier90得到等能面1. Kpoints2. scf3. nscf4. pw2wan及wannier90.x5. XCrySDen可视化 计算过程 pwscf直接得到等能面 pwscf和wannier90得到等能面 pwscf直接得到等能面

weixin_45973682的博客 5070

Spring IOC 容器加载过程

IOC(Inversion of Control,控制反转)是 Spring 框架的核心,其加载过程是 Spring 应用启动的关键阶段。

huing的博客 1292

Open3D 机载点云电力线提取【2025最新版】

传统方法实现的机载点云电力线分割提取。博客长期更新,本文最新更新时间为:2025年3月23日。

点云侠的博客 4468

spring容器 创建对象

方式一 使用无参构造器 package first; public class Student { public Student() { System.out.println("Student()"); } } <!-- 使用无参构造器创建对象 id属性:bean的名称,要求唯一 class属性:类的全限定名 --> 方式二 使用静态工厂方法 <!--

justinLOLxsj的博客 469

CKS-CN考试之路----11

显然是alpine-b的镜像有libcrypto3-3.1.4-r5。新版本发布老版本会被回收,此时pod只剩下2个container。我们依次测试是哪个镜像里包含libcrypto3。可以看到alpine的pod有3个副本.

Q先生 652

RK3588 实战级 YOLOv5 Android 全解析:NPU 量化 + 多线程 + 跟踪算法,源码一次买齐

本文将带你完成一个完整的AI视觉项目:在搭载RK3588芯片的Android开发板上运行实时目标检测与跟踪应用。实战目标:成功运行官方YOLOV5摄像头实时检测案例技术深度:深入理解RKNN开发框架和源码实现核心技能:掌握NPU推理、多线程并发、目标跟踪等关键技术。

FJN110的博客 157

Spring容器的加载过程

Gertent 1810

【Bug已解决】Auto mode cannot determine the safety of an action — Claude Code 自动模式安全判断失败解决方案

将已知安全的操作添加到白名单,分类器不再拦截这些操作。# 步骤 1:编辑 Claude Code 配置"Read","Write"EOF# 步骤 2:白名单中的操作将自动通过# 不在白名单中的操作仍需分类器判断# 步骤 3:重启 Claude Codeclaude方案适用场景推荐指数难度方案一:手动审批偶发回退,安全优先⭐⭐⭐⭐⭐低方案二:/compact 压缩上下文超限导致⭐⭐⭐⭐低方案三:拆分步骤复杂操作触发⭐⭐⭐⭐低方案四:跳过审批隔离环境,CI/CD。

博客 1万+

二、spring mvc项目中spring 容器的创建和加载源码分析

概述 本篇主要介绍通过web.xml和通过实现servlet 3.0开始支持的ServletContainerInitializer接口完成spring mvc容器的创建和加载。 先把结论抛出来: 1.spring mvc项目中有两个spring容器,spring root容器装载着除Controller之外的其他bean,spring mvc容器装载这所有的Controller bean; 2.通过ContextLoaderListener完成spring root容器的加载,通过Dispa..

Keep Moving 541

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Spring源码之IOC容器创建、BeanDefinition加载和注册和IOC容器依赖注入

总结 在SpringApplication#createApplicationContext()执行时创建IOC容器,默认DefaultListableBeanFactory 在AbstractApplicationContext#refresh()方法内执行invokeBeanFactoryPostProcessors(beanFactory);中完成BeanDefinition的资源定位、加载和注册 singleton的bean在AbstractApplicationContext#finishBea

weixin_43843104的博客 256

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

spring容器创建对象的时间和懒加载

我们如何判断一个对象是在spring容器启动的时候创建的呢 还是在我们调用这个对象的时候创建的? 在单例的情况下: 在上面一个spring基础(一)中,我们写了如下的测试类: public class testHelloSpring { @Test public void test1(){ //启动spring容器 Applic

小爷欣欣 5752

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

tomcat启动创建spring父子容器

一、小知识课堂 1.关键性接口ServletContextListener 监听器ServletContextListener,监听ServletContext的生命周期。换句话说,监听Web容器的生命周期。所以说,如果tomcat启动时就加载spring容器,必然与该监听器有关联。 public interface ServletContextListener extends EventListener { // tomcat启动时,触发该方法 void contextInitialized(S

weixin_43843164的博客 457

spring源码学习三:容器的创建流程

1 前言 spring提供了一个接口ApplicationContext,其作用和BeanFactory一样,都是用于加载bean。比如我们在测试类中启动spring的时候,常见的AnnotationConfigApplicationContext类,就实现了这个接口。在我个人目前的理解中,ApplicationContext可以指代spring容器。 本文大部分内容都是参考了《spring 源码深度解析》一书,喜欢的可以买来看看! 2 容器的创建概览 2.1 创建的入口 这里放一个普通的spring测试类

weixin_44137343的博客 1307

spring如何管理创建的多个容器?

spring可以创建多个容器,比如创新一个默认的xml加载的容器 在创建一个classpath加载的容器 或者在创建一个自定义容器 那么我的问题是 这些容器是相互独立的吗?spring如何管理这些容器?他们能一起工作吗?新手上路,查了好久没有结果,望大家帮忙解答哦 ...

woshiniezepeng的博客 1215

浅谈spring AppcationContext和BeanFactory创建容器的不同

AppcationContext 和BeanFactory创建spring容器的区别主要体现在bean创建时间的不同,AppcationContext采用的是创建上下文的方式,代码主要为  ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 采用这种方式创建spring...

张斌斌的博客 1294

Spring的创建和使用

Spring的创建和使用

chenchenchencl的博客 3706

【Spring全家桶系列】Spring核心容器创建方式

我们知道对于核心容器,最顶层的接口是BeanFactory,这也是最早spring创建核心容器的方式,下面我们来考古一下,试着使用BeanFactory接口创建容器和获取Bean。

未见花闻的博客 1687

类被加载到jvm后再被注册到Spring中

在Java中,类被加载到JVM的过程和被注册到Spring容器的过程是两个不同的步骤,但它们是连续发生的。这个过程确保了Java类可以被加载和执行,同时Spring容器可以管理这些类的实例,提供依赖注入、生命周期管理等特性。

qq_36400213的博客 1058

spring cloud,sping boot,微服务,tomcat容器关系及创建执行顺序详解

1、spring cloud 父子容器整体关系 由于在spring cloud启动源码加载过程中,没太弄清楚tomcat容器,spring 容器,spring cloud容器整体的加载顺序以及关系,所以想分析下这个流程,先不多说,上图 容器大致分为三层: BootStrap Spring 容器:由SpringCloud 监听器创建,用来初始化 SpringCloud 上下文 SpringBoot Spring 容器:由SpringBoot创建,也是项目中常用的Spring容器。 微服务 Spring相关容

qq_22162093的博客 2323

【Spring 源码】ApplicationContext 容器的加载原理(一)

ApplicationContext 容器的加载原理

瞎叨叨的一天的博客 535

从Spring容器的启动开始,一篇文章带你搞懂SpringIOC加载过程

Spring容器启动的核心是创建ApplicationContext对象,它负责加载配置、创建BeanDefinition(存储类配置信息)并管理Bean生命周期。容器启动时首先读取配置信息(如XML或注解),扫描带有@Component等注解的类生成BeanDefinition。获取Bean时,容器检查单例池,若不存在则通过反射实例化对象,处理依赖注入(@Autowired),最终将完整Bean存入单例池。整个过程涉及懒加载处理、循环依赖解决等机制,最终通过ApplicationContext提供Bean

xuziang13的博客 726
上一篇: UVa 10288(Coupons) 数学期望(概率+递推) Java
下一篇: codeforces 107B(Basketball Team) 组合+概率 Java
TinyDolphin
博客等级 码龄10年 36粉丝 163原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值