Spring MVC初始化研究

来源:互联网 发布:博微电力造价软件 编辑:程序博客网 时间:2024/05/26 02:51

1.ContextLoaderListener对依赖注入容器的初始化

ContextLoaderListenerServletContextListener接口的实现,Servlet容器在初始化时会调用ServletContextListener上的contextInitialized方法,在容器关闭时会执行contextDestroyed方法。ContextLoaderListenercontextInitialized方法中初始化依赖注入容器,此监听器中初始化的容器作为根容器存在(类图如右图)。

ContextLoaderListener仅仅是作为ServletContextListener的实现,提供了在Servlet容器初始化时调用的接口,真正的初始化依赖注入窗口是由其父类ContextLoader中的方法执行。可以在web.xml中配置相关初始化参数,参数名在ContextLoader中有声明,ContextLoader会按照初始化WebApplicationContext的逻辑来获取初始化参数,如果没有指定初始化参数则使用默认的或者不调用某些代码。如:ContextLoader在调用applicationContext上的refresh方法之前会先获取web.xml中配置的contextInitializerClasses参数的值得到所有的ApplicationContextInitializer实例,然后调用每个ApplicationContextInitializer上的initialize方法,如果没有配置,则不调用。当调用了refresh方法后,进行Spring的初始化。

ContextLoaderListener会将初始化后的ApplicationContext保存在ServletContext中。


2.DispatcherServlet初始化容器的过程

DispatcherServlet初始化容器的过程与ContextLoader相似,不同的是,在初始化依赖注入容器之后,DispatcherServlet需要初始化各种Resolver。
Servlet在初始化时执行的是init方法,在init方法中调用initServletBean,这里使用的是模板方法模式,在initServletBean中需要初始化ApplicationContext,初始化的过程与ContextLoaderListener相似,不同的是,这里在初始化之前先注册了一个ApplicationListener,在容器初始化结束后,会调用ApplicationListener上的方法onApplicationEvent,在DispatcherServlet注册的ApplicationListener中,onApplicationEvent方法的作用是用于注册各个Resolver等对象。ApplicationListener使用了观察者模式。

     
     

     每个Resolver的作用与默认对象,如:

     1.MultipartResolver,此接口有两个实现类,CommonsMultipartResolverStandardMultipartHttpServletRequest,前者依赖于apache commons-fileupload,后者完成使用Servlet3.0实现,如果在依赖注入容器中无法找到namemultipartResolverMultipartResolver接口的实现,则默认为null

     2.LocaleResolver,此接口用于获取地区信息,默认使用的是AcceptHeaderLocaleResolver,用于支持国际化,可通过配置namelocaleResolverbean指定LocaleResolver。使用的时候可以在resources下增加local目录,里面存放与国际化相关的properties文件;

     ……

     在初始化依赖注入容器结束后,DispatcherServlet中创建的各种Resolver和其它对象,都可以被替换,可以实现自己的类,然后将其配置在Spring的配置文件中。



0 0
原创粉丝点击