下图为WebApplicationInitializer 和AbstractAnnotationConfigDispatcherServletInitializer 的关系。
上一篇使用的是实现WebApplicationInitializer 接口的, 这一篇使用继承 AbstractAnnotationConfigDispatcherServletInitializer 类来实现注解版SpingMvc。
public class QuickAppStarter extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{SpringConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{SpringMVCConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
@Override
protected void customizeRegistration(ServletRegistration.Dynamic registration) {
}
}
这里设置的容器为一个父子容器
SpringConfig
@ComponentScan(value = "com.atguigu.boot",excludeFilters = {
@ComponentScan.Filter(type= FilterType.ANNOTATION,value = Controller.class)
})
@Configuration
public class SpringConfig {
}
SpringMVCConfig
@ComponentScan(value = "com.atguigu.boot",includeFilters = {
@ComponentScan.Filter(type= FilterType.ANNOTATION,value = Controller.class)
},useDefaultFilters = false)
public class SpringMVCConfig {
}
1.父子容器的概念
在上一篇中写到web容器准备的时候
FrameworkServlet 这个方法中设置了父子容器。
当spring ioc容器初始化的时候, 无web容器, 所以spring ioc容器为根容器 当spring web容器初始化的时候, 设置ioc容器为其父容器。
父子容器的优点:
2.SpringMvc父子容器的启动过程
根据super.onStartup() :
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
super.onStartup(servletContext);
registerDispatcherServlet(servletContext);
}
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, 事务, 自动装配
|