下图为WebApplicationInitializer
和AbstractAnnotationConfigDispatcherServletInitializer
的关系。
上一篇使用的是实现WebApplicationInitializer
接口的, 这一篇使用继承
AbstractAnnotationConfigDispatcherServletInitializer
类来实现注解版SpingMvc。
这里设置的容器为一个父子容器
SpringConfig
SpringMVCConfig
1.父子容器的概念
在上一篇中写到web容器准备的时候
FrameworkServlet
这个方法中设置了父子容器。
当spring ioc容器初始化的时候, 无web容器, 所以spring ioc容器为根容器
当spring web容器初始化的时候, 设置ioc容器为其父容器。
父子容器的优点:
- 双亲委派, 可以达到容器隔离。
2.SpringMvc父子容器的启动过程
根据super.onStartup() :
super.onStartup(servletContext):
准备ioc根容器
ContextLoaderListener#contextInitialized()
1.创建一个根容器
2.准备一个监听器, 保存了ioc容器
3.监听器ContextLoaderListener调用contextInitialized方法初始化容器
registerDispatcherServlet(servletContext);
注册DipatcherServlet
当创建DispatcherServlet的时候, 会初始化DS, 那个时候web容器会初始化。
这里的web容器保存在DispatcherServlet中。
得到了ioc容器和web容器后, 通过cwac.setParent(rootContext);
这个方法设置了他们为父子容器。
3.Question
Q1:
ioc容器和web容器分别是什么时候初始化的
RA:
ioc根容器是在web应用启动的时候, tomcat触发监听器钩子来启动的
web容器是在tomcat启动后, tomcat会调用DispatcherServlet的初始化init()方法进行初始化
Q2:
ioc容器和web容器分别保存在什么地方
RA:
ioc容器在初始化之前
保存在监听器中, 初始化之后
保存在application作用域中
web容器初始化之前
保存在DispatcherServlet中
Q3:
ioc容器初始化的时候会初始化哪些内容
RA:
ioc容器会加载页面逻辑组件功能, 比如Aop, ioc, 事务, 自动装配