Spring启动过程(面试总结版~)

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

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

以下内容转载自https://blog.csdn.net/haohaizijhz/article/details/90674774

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对象?

public void contextInitialized(ServletContextEvent sce) {
  ApplicationContext context = (ApplicationContext) sce.getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); 
  UserService userService = (UserService) context.getBean("userService");
}
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容器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层。执行业务操作后返回结果。
初始化过程

  • 18
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值