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容器
- prepareRefresh;准备上下文环境
- 得到一个beanFactory组件。
- 预处理 prepareBeanFactory(BeanFactory)
- 对BeanFactory组件进行后处理 postProcessBeanFactory(BeanFactory)
- 调用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容器中有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层。执行业务操作后返回结果。