spring webmvc启动流程
如果在web.xml中配置了org.springframework.web.context.ContextLoaderListener,那么Tomcat在启动的时候会先加载父容器,并将其放到ServletContext中;
然后会加载DispatcherServlet(这块流程建议从init方法一步步往下看,流程还是很清晰的),因为DispatcherServlet实质是一个Servlet,所以会先执行它的init方法。这个init方法在HttpServletBean这个类中实现,其主要工作是做一些初始化工作,将我们在web.xml中配置的参数书设置到Servlet中,然后再触发FrameworkServlet的initServletBean()方法;
FrameworkServlet主要作用是初始化Spring子上下文,设置其父上下文,并将其放入ServletContext中;
FrameworkServlet在调用initServletBean()的过程中同时会触发DispatcherServlet的onRefresh()方法,这个方法会初始化Spring MVC的各个功能组件。比如异常处理器、视图处理器、请求映射处理等。
参考:https://www.cnblogs.com/54chensongxia/p/12522804.html?utm_source=tuicool&utm_medium=referral
servlet注册
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
IoC容器创建
//创建基于注解的springIOC容器
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AopBeanConfig.class);
//创建基于配置文件的springIOC容器
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/spring-beans.xml");
- epareRefresh 准备刷新容器
- obtainFreshBeanFactory 获取组件工厂
- prepareBeanFactory 对组件工厂做各种预处理设置
- postProcessBeanFactory 组件工厂的后置处理工作
- invokeBeanFactoryPostProcessors 执行组件工厂后置处理器
- registerBeanPostProcessors 注册组件后置处理器,这种处理器用于拦截bean的创建过程
- initMessageSource 初始化消息源组件,用于消息绑定、消息解析等功能,并且提供国际化解决方案
- initApplicationEventMulticaster 初始化事件广播器
- onRefresh 没有任何操作,留给子类继承的,我们可以自定义子容器,在重写方法中做一些我们想要的操作
- registerListeners 注册事件监听器
- finishBeanFactoryInitialization 完成剩下的单实例bean的初始化
- finishRefresh 完成容器刷新
参考:https://www.cnblogs.com/dubhlinn/p/10764845.htm
bean初始化
一个类同时实现了 BeanNameAware, BeanFactoryAware, ApplicationContextAware, BeanPostProcessor, InitializingBean, DisposableBean接口时,Bean 的初始化过程为:.
1.调用 BeanNameAware 的setBeanName 方法
2.调用 BeanFactoryAware 的 setBeanFactory 方法
3.调用 ApplicationContextAware 的 setApplicationContext
4.调用 InitializingBean 的 afterPropertiesSet 或者没有实现这个接口,但指定了@Bean(initMethod=“不加括号的方法名”),会执行这个方法
5.调用 BeanPostProcessor 的 postProcessBeforeInitialization 方法
6.调用 BeanPostProcessor 的 postProcessAfterInitialization 方法
7.Bean 初始化完成,可以被使用
8.容器关闭前,调用 DisposableBean 的 destroy 方法
但是在整个系统中,BeanPostProcessor的实现类只需要有一个即可,Spring 检测到它的存在时,每个 Bean 被初始化时,都会调用它的方法。注意,是所有 Bean 都会调用它的方法。
如果一个类除BeanPostProcessor外,实现了其他的接口,有另外一个类单独实现了BeanPostProcessor接口,那么上面的初始化过程中,第 4 步和第 5 步调换位置。
参考:https://editor.csdn.net/md?articleId=105545634
mvc流程
1、用户发送请求至前端控制器DispatcherServlet。
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、
DispatcherServlet调用HandlerAdapter处理器适配器。
5、HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6、Controller执行完成返回ModelAndView。
7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、ViewReslover解析后返回具体View.
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet响应用户。
参考:https://blog.csdn.net/floating_dreaming/article/details/89089214