【Spring容器的启动流程】

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


相关文章
|
1月前
|
XML Java 数据格式
Spring容器的本质
本文主要讨论Spring容器最核心的机制,用最少的代码讲清楚Spring容器的本质。
|
1月前
|
IDE Java 应用服务中间件
spring boot 启动流程
Spring Boot 启动流程简介: 在使用 Spring Boot 之前,启动 Java Web 应用需要配置 Web 容器(如 Tomcat),并将应用打包放入容器目录。而使用 Spring Boot,只需运行 main() 方法即可启动 Web 应用。Spring Boot 的核心启动方法是 SpringApplication.run(),它负责初始化和启动应用上下文。 主要步骤包括: 1. **应用启动计时**:使用 StopWatch 记录启动时间。 2. **打印 Banner**:显示 Spring Boot 的 LOGO。 3. **创建上下文实例**:通过反射创建
132 5
|
3月前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
93 6
|
3月前
|
安全 Java 开发者
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
62 1
|
4月前
|
前端开发 Java Docker
使用Docker容器化部署Spring Boot应用程序
使用Docker容器化部署Spring Boot应用程序
|
5月前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
4月前
|
Java Docker 微服务
利用Docker容器化部署Spring Boot应用
利用Docker容器化部署Spring Boot应用
89 0
|
5月前
|
XML Java 应用服务中间件
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
370 2
|
6月前
|
XML Java 开发者
经典面试---spring IOC容器的核心实现原理
作为一名拥有十年研发经验的工程师,对Spring框架尤其是其IOC(Inversion of Control,控制反转)容器的核心实现原理有着深入的理解。
278 3
|
5月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
129 0