前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring 的启动过程

Spring 的启动过程

作者头像
长乐坡头
发布2024-01-19 13:50:54
1060
发布2024-01-19 13:50:54

1. Spring启动过程

spring的启动过程是IOC容器的启动过程,本质是创建和初始化bean工厂(BeanFactory)。BeanFactory是Spring IOC的核心,Spring使用beanFactory来实例化,配置和管理bean。

对于web程序,IOC容器启动过程即是建立上下文的过程,web容器会提供一个全局的servletContext上下文环境。

其启动过程主要包含三个类,ContextLoaderListener,ContextLoader和XmlWebApplicationContext。

在web.xml中提供ContextLoaderListener上下文监听器,在web容器启动时,会触发容器初始化事件,ContextLoaderListener会监听到这个事件,从而触发ContextInitialized方法完成上下文初始化,这个方法中调用父类ContextLoader的方法完成上下文初始化。

ContextLoader类中主要完成三件事:

1)创建WebApplicationContext;

2)加载对应的Spring配置文件中的bean;(refresh方法,完成bean的加载)

3)将WebApplicationContext放入servletContext中。

ContextLoaderListener监听器初始化完之后,开始初始化web.xml中配置的servlet,如DispatcherSevlet。 ContextLoaderListener监听器监听的是servletContext,当web容器初始化后,servletContext发生变化时,会触发相应事件。

触发的事件 ContextClosedEvent ContextRefreshedEvent ContextStartedEvent ContextStoopedEvent RequestHandleEvent Spring容器启动后会触发ContextRefreshedEvent事件,想要在某个类加载完毕是干某事,但用了Spring管理对象,这个类又引用了其他类,比较复杂,可以写一个类继承Spring的ApplicationListener监听并监控ContextRefreshedEvent事件。

对于非web程序也是差不多的步骤 1 新建IOC容器 new AnnotationConfigApplicationContext(xx.class); 2 refesh初始化IOC容器

  1. prepareRefresh;准备上下文环境
  2. 得到一个beanFactory组件。
  3. 预处理 prepareBeanFactory(BeanFactory)
  4. 对BeanFactory组件进行后处理 postProcessBeanFactory(BeanFactory)
  5. 调用bean工厂的后置处理器 invokeBeanFactoryPostProcessors

2. Spring bean的生命周期

new->属性注入->Init生命周期初始化方法->初始化回调方法->代理AOP->放入单例池 singletonObject

3. Spring容器和SpringMVC容器

Spring容器和SpringMVC容器是管理bean对象的地方,简单来说,SpringMVC容器是管理controller对象的容器,Spring容器是管理service和dao的容器。 Spring容器和SpringMVC容器是父子容器的关系,Spring容器是父容器,SpringMVC容器是子容器,在子容器中可以访问父容器的对象,但父容器中不能访问子容器的对象。 所有bean都被Spring或SpringMVC容器管理,他们可以直接注入,SpringMVC的拦截器也是由SpringMVC容器管理,所以在SpringMVC的拦截器中也可以直接注入bean对象。

web容器 web容器是管理servlet和监听器以及过滤器的,但这些不在Spring,SpringMVC的掌握范围中,在这些类中无法直接使用Spring注解注入bean对象。 在这些类中如何获取bean对象?

代码语言:javascript
复制
public void contextInitialized(ServletContextEvent sce) {
  ApplicationContext context = (ApplicationContext) sce.getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); 
  UserService userService = (UserService) context.getBean("userService");
}
代码语言:javascript
复制
public void contextInitialized(ServletContextEvent sce) {
  WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext()); 
  UserService userService = (UserService) webApplicationContext.getBean("userService"); 
}

前提,确保servlet容器在实例化ConfigListener并调用其方法之前,Spring容器已经初始化完毕,而Spring容器的初始化由Listener(ContextLoaderListener)完成,只需在web.xml中先配置初始化spring容器的listener,然后配置自己的listener。

web容器中有servlet容器,spring项目部署后存在spring容器和springmvc容器。其中spring控制service层和dao层的bean对象。springmvc容器控制controller层bean对象。servlet容器控制servlet对象。项目启动时,首先 servlet初始化,初始化过程中通过web.xml中spring的配置加载spring配置,初始化spring容器和springmvc容器。待容器加载完成。servlet初始化完成,则完成启动。 HTTP请求到达web容器后,会到达Servlet容器,容器通过分发器分发到具体的spring的Controller层。执行业务操作后返回结果。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. Spring启动过程
  • 2. Spring bean的生命周期
  • 3. Spring容器和SpringMVC容器
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档