一、SpringMVC 初始化
2021-01-05
我是用springboot搭建的项目,当服务启动的时候springmvc 并没有初始化,当第一次调用的时候进行初始化,如下:
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context);
initLocaleResolver(context);
initThemeResolver(context);
initHandlerMappings(context);
initHandlerAdapters(context);
initHandlerExceptionResolvers(context);
initRequestToViewNameTranslator(context);
initViewResolvers(context);
initFlashMapManager(context);
}
initMultipartResolver 用于处理文件上传
initLocaleResolver 国际化
initThemeResolve 主题
主题的实现原理:大概就是把网站版面的css样式表和图片之类的文件和网站的程序进行解耦,程序读取theme的持久化配置,然后找到相应的css样式表和图片,配置网站版面。
initHandlerMappings 负责映射用户的URL和对应的处理类
initHandlerAdapters 是处理适配器,它的作用是调用具体的方法对用户发来的请求来进行处理,Spring MVC就是通过HandlerAdapter来实际调用处理函数。
initHandlerExceptionResolvers 处理异常
initRequestToViewNameTranslator 用于处理没有返回视图名时的情况下如何得到一个默认的视图名
initViewResolvers 视图解析器,作用是把逻辑视图名称解析为真正的视图,然后通过view对象进行渲染。
initFlashMapManager 初始化flashMap ,用于重定向redirect时候传递参数
2021-01-06
初始化工作基本上是context.getBean(name,class) ,如果异常,就通过getDefaultStrategy(context,class) 加载默认bean,前面是从spring容器中加载相应的bean,后者通过加载
DispatcherServlet.properties配置文件,然后获得默认策略,如下:
ClassPathResource resource = new ClassPathResource(DEFAULT_STRATEGIES_PATH, DispatcherServlet.class);
defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);
接着,通过对应接口获取获得key,在defaultStrategies中获得加载的所有类名,反射加载类返回,如下
Class<?> clazz = ClassUtils.forName(className, DispatcherServlet.class.getClassLoader());
Object strategy = createDefaultStrategy(context, clazz);
strategies.add((T) strategy);
初始化完成,九个策略基本都这种模式进行初始化。