springboot-容器及启动过程

SpringBoot会启动两个容器,即父子容器
父容器(Spring容器):AnnotationConfigWebApplicationContex
子容器(SpringMVC容器):AnnotationConfigEmbeddedWebApplicationContex

思考几个问题:
问题1:为什么要启动父子两个容器?
在Spring整体框架的核心概念中,容器是核心思想,而在一个项目中,容器不一定只有一个,Spring中可以包括多个容器,使用上下层关系来管理容器可以解决公共属性抽取的问题,即将公共的属性放到父容器中,对其各个子容器均可见,实现了复用功能,注意子容器对父容器是不可见的。
问题2:在什么时候启动父容器?
准备环境变量,即执行prepareEnvironment方法时,发布ApplicationEnvironmentPreparedEvent事件,BootstrapApplicationListener监听器收到该事件,会初始化父容器
问题3:父容器和子容器的区别?
1.子容器中会创建植入的tomcat容器类,用来管理tomcat服务,父容器没有
2.父容器管理的bean集合是spring框架内置的一些bean,子容器管理的bean集合是我们业务定义的bean以及spring框架内置的bean
问题4:怎么保证父容器启动过程中,执行prepareEnvironment方法时,BootstrapApplicationListener监听器不再重复执行?
父容器初始化完成后,会在webEnvironment属性中加入bootstrap属性标识,这样就可以根据该标识来判断是否需要执行了
问题5:容器实际通过什么来管理bean
容器通过beanFactory来管理对象,父子容器都会各持有一个DefaultListableBeanFactory,即父子容器都会管理各自的bean。

子容器启动流程:
1.执行初始化:初始化webEnvironment以及listeners
2.发布容器启动事件
3.在执行prepareEnvironment步骤时,发布ApplicationEnvironmentPreparedEvent事件,BootstrapApplicationListener监听器收到该事件,会再次调用SpringApplication
  初始化和run方法(初始化父容器的步骤类似子容器)
4.创建context,通过判断webEnvironment标识,这时为true,创建AnnotationConfigEmbeddedWebApplicationContext实例
5.执行refreshContext,比较核心的方法,详细说一下:
  1.获取bean工厂,即创建DefaultListableBeanFactory实例
  2.为bean工厂赋一些基础属性,主要有类加载器
  3.为bean工厂注册WebApplicationContextServletContextAwareProcessor,一个BeanPostProcessor,主要用于获取ServletContext
  4.执行beanFactoryPostProcessor,递归处理,主要用于扫描@CompontScan、@Import、@ImportSource等注解的类,首先注册bean元数据到工厂,然后可以修改bean工厂
  5.实例化BeanPostProcessor类并注册到bean工厂单例列表中
  6.实例化消息通知类并注册到bean工厂单例列表中
  7.调用onRefresh方法,初始化一个植入的tomcat容器
  8.注册监听器到消息通知器中,区分为两类:一、从系统配置中加载的监听器(已实例化) 二、已注册但还未实例化的监听器
  9.实例化注册表中的所有bean,创建bean的过程中会执行bean的初始化操作,会执行BeanPostProcessor、afterPropertiesSet、初始化方法等等
  10.调用finishRefresh,启动所有bean,发布ContextRefreshed事件
6.执行afterRefresh,调用实现了ApplicationRunner/CommandLineRunner接口的bean run方法
7.发布ApplicationReadyEvent事件

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Spring Boot的容器启动流程可以简要概括为以下几个步骤: 1. 加载配置文件:Spring Boot会首先加载应用的配置文件,包括application.properties或application.yml等文件,这些配置文件中保存了应用的各种配置信息,如数据库连接、端口号等。 2. 创建Spring应用上下文:接下来,Spring Boot会创建一个Spring应用上下文,该上下文是整个应用的核心容器,负责管理各个Bean的创建、依赖注入等操作。 3. 自动配置:Spring Boot会根据应用的配置文件和约定,自动配置一些常用的Bean,如数据库连接池、Web服务器等。这样,开发者无需手动配置这些组件,可以快速搭建一个可用的应用。 4. 扫描组件:Spring Boot会扫描应用中的所有组件,包括Controller、Service、Repository等,将它们注册到Spring容器中,以便后续的依赖注入和请求处理。 5. 启动应用:最后,Spring Boot会启动Web服务器,如Tomcat或Jetty,将应用部署到服务器上,使之可以接收并处理外部请求。 综上所述,Spring Boot的容器启动流程包括加载配置文件、创建Spring应用上下文、自动配置、扫描组件和启动应用这几个关键步骤。通过这些步骤,Spring Boot能够快速、简便地启动一个可用的Spring应用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [9千字长文带你了解SpringBoot启动过程--史上最详细 SpringBoot启动流程-图文并茂](https://blog.csdn.net/weixin_44947701/article/details/124055713)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值