当前位置: 首页 > news >正文

丽江建设网站网上国网推广宣传语

丽江建设网站,网上国网推广宣传语,最大的建材采购平台,做界面的网站SpringMVC的启动入口在SpringServletContainerInitializer类#xff0c;它是ServletContainerInitializer实现类(Servlet3.0新特性)。在实现方法中使用WebApplicationInitializer创建ApplicationContext、创建注册DispatcherServlet、初始化ApplicationContext等。 SpringMVC…SpringMVC的启动入口在SpringServletContainerInitializer类它是ServletContainerInitializer实现类(Servlet3.0新特性)。在实现方法中使用WebApplicationInitializer创建ApplicationContext、创建注册DispatcherServlet、初始化ApplicationContext等。 SpringMVC已经将大部分的启动逻辑封装在了几个抽象WebApplicationInitializer中开发者只要继承这些抽象类实现抽象方法即可。 本文将详细分析ServletContainerInitializer、SpringServletContainerInitializer和WebApplicationInitializer的工作流程。 Servlet3.0的ServletContainerInitializer ServletContainerInitializer接口 ServletContainerInitializer是Servlet3.0的接口。 该接口在web应用程序启动阶段接收通知注册servlet、filter、listener等。 该接口的实现类可以用HandlesTypes进行标注并指定一个Class值后续会将实现、扩展了这个Class的类集合作为参数传递给onStartup方法。 以tomcat为例在容器配置初始化阶段将使用SPI查找实现类在ServletContext启动阶段初始化并调用onStartup方法来进行ServletContext的初始化。 SpringServletContainerInitializer实现类 在onStartup方法创建所有的WebApplicationInitializer对并调用onStartup方法。 以下为SPI配置在spring-web/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer文件 WebApplicationInitializer接口 WebApplicationInitializer接口概述 Interface to be implemented in Servlet 3.0 environments in order to configure the ServletContext programmatically – as opposed to (or possibly in conjunction with) the traditional web.xml-based approach. Implementations of this SPI will be detected automatically by SpringServletContainerInitializer, which itself is bootstrapped automatically by any Servlet 3.0 container. See its Javadoc for details on this bootstrapping mechanism. 示例 public class MyWebAppInitializer implements WebApplicationInitializer {Overridepublic void onStartup(ServletContext container) {// Create the root Spring application contextAnnotationConfigWebApplicationContext rootContext new AnnotationConfigWebApplicationContext();rootContext.register(AppConfig.class);// Manage the lifecycle of the root application contextcontainer.addListener(new ContextLoaderListener(rootContext));// Create the dispatcher servlets Spring application contextAnnotationConfigWebApplicationContext dispatcherContext new AnnotationConfigWebApplicationContext();dispatcherContext.register(DispatcherConfig.class);// Register and map the dispatcher servletServletRegistration.Dynamic dispatcher container.addServlet(dispatcher, new DispatcherServlet(dispatcherContext));dispatcher.setLoadOnStartup(1);dispatcher.addMapping(/);} }开发者可以编写类继承AbstractAnnotationConfigDispatcherServletInitializer抽象类这个抽象类已经将大部分的初始化逻辑进行了封装。 WebApplicationInitializer实现和继承关系 AbstractContextLoaderInitializer类 Convenient base class for WebApplicationInitializer implementations that register a ContextLoaderListener in the servlet context. The only method required to be implemented by subclasses is createRootApplicationContext(), which gets invoked from registerContextLoaderListener(ServletContext). AbstractDispatcherServletInitializer类 Base class for WebApplicationInitializer implementations that register a DispatcherServlet in the servlet context. Most applications should consider extending the Spring Java config subclass AbstractAnnotationConfigDispatcherServletInitializer. AbstractAnnotationConfigDispatcherServletInitializer类 WebApplicationInitializer to register a DispatcherServlet and use Java-based Spring configuration. Implementations are required to implement: getRootConfigClasses() – for “root” application context (non-web infrastructure) configuration.getServletConfigClasses() – for DispatcherServlet application context (Spring MVC infrastructure) configuration. If an application context hierarchy is not required, applications may return all configuration via getRootConfigClasses() and return null from getServletConfigClasses(). 开发者SpringMvcInitializer示例 开发者需要编写类继承AbstractAnnotationConfigDispatcherServletInitializer类实现几个抽象方法 public class SpringMvcInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {/*** 指定创建root application context需要的Configuration/Component类*/Overrideprotected Class?[] getRootConfigClasses() {return new Class[]{AppConfig.class};}/*** 指定创建Servlet application context需要的Configuration/Component类* 如果所有的配置类都使用root config classes就返回null*/Overrideprotected Class?[] getServletConfigClasses() {return null;}/*** Specify the servlet mapping(s) for the DispatcherServlet — for example /, /app, etc.*/Overrideprotected String[] getServletMappings() {return new String[]{/};} }SpringMVC启动流程 入口AbstractDispatcherServletInitializer.onStartup方法 public void onStartup(ServletContext servletContext) throws ServletException {super.onStartup(servletContext);registerDispatcherServlet(servletContext); }父类的onStartup方法创建RootApplicationContext、注册ContextLoaderListener监听器 public void onStartup(ServletContext servletContext) throws ServletException {registerContextLoaderListener(servletContext); }protected void registerContextLoaderListener(ServletContext servletContext) {WebApplicationContext rootAppContext createRootApplicationContext();if (rootAppContext ! null) {// ContextLoaderListener是ServletContextListener// 会在contextInitialized阶段初始化RootApplicationContextContextLoaderListener listener new ContextLoaderListener(rootAppContext);listener.setContextInitializers(getRootApplicationContextInitializers());servletContext.addListener(listener);} }注册DispatcherServlet registerDispatcherServlet方法用于创建ServletApplicationContext、注册DispatcherServlet protected void registerDispatcherServlet(ServletContext servletContext) {String servletName getServletName();// 创建ServletApplicationContextWebApplicationContext servletAppContext createServletApplicationContext();// 创建DispatcherServletFrameworkServlet dispatcherServlet createDispatcherServlet(servletAppContext);// 添加ApplicationContextInitializer集会在初始化时调用dispatcherServlet.setContextInitializers(getServletApplicationContextInitializers());// 添加到ServletContextServletRegistration.Dynamic registration servletContext.addServlet(servletName, dispatcherServlet);registration.setLoadOnStartup(1);registration.addMapping(getServletMappings());registration.setAsyncSupported(isAsyncSupported());Filter[] filters getServletFilters();if (!ObjectUtils.isEmpty(filters)) {for (Filter filter : filters) {registerServletFilter(servletContext, filter);}}customizeRegistration(registration); }触发ContextLoaderListener监听器contextInitialized事件 这个是Servlet的ServletContextListener机制在ServletContext创建之后触发contextInitialized事件 public void contextInitialized(ServletContextEvent event) {initWebApplicationContext(event.getServletContext()); }public WebApplicationContext initWebApplicationContext(ServletContext servletContext) {// 判断是否已经在当前ServletContext绑定了WebApplicationContext// 如果已经绑定抛错if (servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE) ! null) {throw new IllegalStateException(已经初始化过了);}try {if (this.context null) {this.context createWebApplicationContext(servletContext);}if (this.context instanceof ConfigurableWebApplicationContext) {ConfigurableWebApplicationContext cwac (ConfigurableWebApplicationContext) this.context;if (!cwac.isActive()) {if (cwac.getParent() null) {ApplicationContext parent loadParentContext(servletContext);cwac.setParent(parent);}// refreshconfigureAndRefreshWebApplicationContext(cwac, servletContext);}}servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);ClassLoader ccl Thread.currentThread().getContextClassLoader();if (ccl ContextLoader.class.getClassLoader()) {currentContext this.context;} else if (ccl ! null) {currentContextPerThread.put(ccl, this.context);}return this.context;} catch (RuntimeException | Error ex) {servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, ex);throw ex;} }protected void configureAndRefreshWebApplicationContext(ConfigurableWebApplicationContext wac, ServletContext sc) {// 给wac设置idwac.setServletContext(sc);// 设置spring主配置文件路径String configLocationParam sc.getInitParameter(CONFIG_LOCATION_PARAM);if (configLocationParam ! null) {wac.setConfigLocation(configLocationParam);}ConfigurableEnvironment env wac.getEnvironment();if (env instanceof ConfigurableWebEnvironment) {((ConfigurableWebEnvironment) env).initPropertySources(sc, null);}customizeContext(sc, wac);// 刷新ApplicationContextwac.refresh(); }触发DispatcherServlet的init事件 Servlet在接收请求之前会调用其init方法进行初始化这个是Servlet的规范。 init方法在其父类HttpServletBean中 public final void init() throws ServletException {// 从ServletConfig获取配置设置到ServletPropertyValues pvs new ServletConfigPropertyValues(getServletConfig(), this.requiredProperties);if (!pvs.isEmpty()) {try {BeanWrapper bw PropertyAccessorFactory.forBeanPropertyAccess(this);ResourceLoader resourceLoader new ServletContextResourceLoader(getServletContext());bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, getEnvironment()));initBeanWrapper(bw);bw.setPropertyValues(pvs, true);} catch (BeansException ex) {throw ex;}}// 初始化initServletBean(); }// FrameworkServlet protected final void initServletBean() throws ServletException {try {// 初始化ServletApplicationContextthis.webApplicationContext initWebApplicationContext();initFrameworkServlet();} catch (ServletException | RuntimeException ex) {throw ex;} }protected WebApplicationContext initWebApplicationContext() {// 获取rootApplicationContext// 之前的ServletContext初始化阶段已经绑定WebApplicationContext rootContext WebApplicationContextUtils.getWebApplicationContext(getServletContext());WebApplicationContext wac null;if (this.webApplicationContext ! null) {wac this.webApplicationContext;if (wac instanceof ConfigurableWebApplicationContext) {ConfigurableWebApplicationContext cwac (ConfigurableWebApplicationContext) wac;if (!cwac.isActive()) {// 将rootApplicationContext设置为Parentif (cwac.getParent() null) {cwac.setParent(rootContext);}// 刷新ApplicationContextconfigureAndRefreshWebApplicationContext(cwac);}}}// 如果没有需要查找或创建if (wac null) {wac findWebApplicationContext();}if (wac null) {wac createWebApplicationContext(rootContext);}if (!this.refreshEventReceived) {synchronized (this.onRefreshMonitor) {// 子类实现onRefresh(wac);}}if (this.publishContext) {String attrName getServletContextAttributeName();getServletContext().setAttribute(attrName, wac);}return wac; }// DispatcherServlet protected void onRefresh(ApplicationContext context) {initStrategies(context); }// 初始化SpringMVC相关组件 protected void initStrategies(ApplicationContext context) {initMultipartResolver(context);initLocaleResolver(context);initThemeResolver(context);initHandlerMappings(context);initHandlerAdapters(context);initHandlerExceptionResolvers(context);initRequestToViewNameTranslator(context);initViewResolvers(context);initFlashMapManager(context); }SpringMVC启动流程总结 创建RootApplicationContext、注册ContextLoaderListener监听器创建ServletApplicationContext、注册DispatcherServlet触发ContextLoaderListener监听器contextInitialized事件初始化RootApplicationContext触发DispatcherServlet的init事件初始化ServletApplicationContext
http://www.dnsts.com.cn/news/225628.html

相关文章:

  • 自助网站制作系统源码网站设计公司那个好
  • 建筑专业名词网站优秀企业网站首页
  • 汉中市住房和城乡建设局网站自建网站优缺点
  • 微商城建设购物网站wordpress 主题 瓷砖
  • 池州网站建设费用wordpress页面显示分类目录
  • 淘宝客导购网站 丢单设计平台化
  • 网站电脑培训班附近有吗网页设计与制作的招聘
  • 电子商务网站建设 市场分析app优化建议
  • 网站内容过滤孝感织云网站建设
  • 网站建设人员培训广州专业的网站建设公司
  • 昆明招聘网站建设普工小工个人微信小程序开店
  • 湖北省建设厅官方网站做网站哪家公司专业
  • 怎样做旅游城市住宿网站平面设计到题目
  • 上海网站建设的价格是多少钱毕业设计做网站还是系统
  • wordpress邮箱插件下载济南网站系统优化
  • 餐饮行业网站建设风格企业邮箱怎么申请注册流程
  • 网站开发业务方向架构文档wordpress主题制作版权验证
  • 没公司怎么做网站云服务器和云虚拟主机
  • ps模板网站小程序文档
  • 怎么学做淘宝电商网站企业宣传册模板设计素材
  • 自己做网站可以上传软件下载怎样了解网站建设是否专业
  • 黔东南网站建设开发一个网站
  • 长尾关键词爱站ie建设企业网站进去无法显示
  • 黄页88网怎么推广沧州网站改版优化
  • 如何用爬虫做网站监控网站建设就业前景
  • php语言 网站建设中国进出口贸易网
  • 做动画网站去哪采集地方门户网站盈利
  • 喜欢做网站的行业建网站的公司服务
  • 顾村网站建设安卓 wordpress 源码
  • 极简个人网站模板三星单片机开发网站