`
aidxn527
  • 浏览: 43399 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类

spring有三种启动方式

阅读更多

spring有三种启动方式,使用ContextLoaderServlet,ContextLoaderListener和ContextLoaderPlugIn.

 

看一下ContextLoaderListener的源码,这是一个ServletContextListener

[

 (
     
public interface ServletContextListener extends EventListener {

        public void contextInitialized ( ServletContextEvent sce );        
        public void contextDestroyed ( ServletContextEvent sce );
}
 
 )

   ServletContextListener接口有两方需要实现的方法:contextInitialized()和contextDestroyed();

   Listener,译为监听者.顾名思义,它会监听Servlet容器,当应用开始的时候它会调用contextInitialized()方法;
   当应用关闭的时候,它同样会调用contextDestroyed()方法.

   我们可以利用这个特性初始化一些信息,当然我们也可以利用Servlet类init()方法,并在配置文件中让它启动应用的时候
   就执行,并且在关闭的时候执行destroy()方法.但是继承此接口应该更符合容器的应用. 

]


 

/**
  * Initialize the root web application context.
  */


 public void contextInitialized(ServletContextEvent event) {
       this.contextLoader = createContextLoader();
       this.contextLoader.initWebApplicationContext(event.getServletContext());
 }
 
  /**
  * Create the ContextLoader to use. Can be overridden in subclasses.
  * @return the new ContextLoader
  */


 protected ContextLoader createContextLoader() {
       return new ContextLoader();
 }

 

 

 contextLoader的源码 

 public WebApplicationContext initWebApplicationContext(ServletContext servletContext)
   throws BeansException {

              long startTime = System.currentTimeMillis();
              if (logger.isInfoEnabled()) {
                     logger.info("Root WebApplicationContext: initialization started");
              }
              servletContext.log("Loading Spring root WebApplicationContext");

              try {
                      // Determine parent for root web application context, if any.
                      ApplicationContext parent = loadParentContext(servletContext);

                      WebApplicationContext wac = createWebApplicationContext(servletContext, parent);
                      servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, wac);

                       if (logger.isInfoEnabled()) {
                             logger.info("Using context class [" + wac.getClass().getName() +"] for root WebApplicationContext");
                       }
                       if (logger.isDebugEnabled()) {
                             logger.debug("Published root WebApplicationContext [" + wac +"] as ServletContext attribute with name [" +
                            WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE + "]");
                       }

                       if (logger.isInfoEnabled()) {
                               long elapsedTime = System.currentTimeMillis() - startTime;
                               logger.info("Root WebApplicationContext: initialization completed in " + elapsedTime + " ms");
                       }

                       return wac;
                }
                catch (RuntimeException ex) {
                            logger.error("Context initialization failed", ex);
                            servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, ex);
                            throw ex;
                }
                catch (Error err) {
                            logger.error("Context initialization failed", err);
                            servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, err);
                            throw err;
               }
 }

 
 注意WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,这里面放了WebApplicationContext,需要使用时从ServletContext取出
 可以使用WebApplicationContextUtils得到WebApplicationContext
 public static WebApplicationContext getWebApplicationContext(ServletContext sc) {
  Object attr = sc.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
  if (attr == null) {
   return null;
  }
  if (attr instanceof RuntimeException) {
   throw (RuntimeException) attr;
  }
  if (attr instanceof Error) {
   throw (Error) attr;
  }
  if (!(attr instanceof WebApplicationContext)) {
   throw new IllegalStateException("Root context attribute is not of type WebApplicationContext: " + attr);
  }
  return (WebApplicationContext) attr;
 }

 


 关键的问题在于struts如何启动的spring的,ContextLoaderPlugIn的源码
 
 // Publish the context as a servlet context attribute.
  String attrName = getServletContextAttributeName();
  getServletContext().setAttribute(attrName, wac);
 
 public String getServletContextAttributeName() {
  return SERVLET_CONTEXT_PREFIX + getModulePrefix();
 }


 不同加载的Key竟然不同,原因就是WebApplicationContext放在那里的问题,可spring调用的时候会根据WebApplicationContext里面定义的那个名字去找的,问题出在这里


 在struts-config.xml中配置
    <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
      <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" />
    </plug-in>

    <controller>
        <set-property property="processorClass" value="org.springframework.web.struts.DelegatingRequestProcessor" />
    </controller>


 原理是这样的,Struts虽然只能有一个ActionServlet实例,但是对于不同的子应用分别能有自己的RequestProcessor实例每个RequestProcessor实例分别对应不同的struts配置文件。
   子应用的ProcessorClass类必须重写一般就是继承RequestProcessor类,然后再其配置文件的controller元素中的<processorClass>属性中作出修改。那么当
  getRequestProcessor(getModuleConfig(request)).process(request,response);就能根据request选择相应的moduleconfig,再根据其<processorClass>属性选择相应的RequestProcessor子类来处理相应的请求了。

 

分享到:
评论

相关推荐

    spring boot三种启动方式.txt

    spring boot三种启动方式.txt

    spring配置和启动方式

    spring配置和启动方式 博客地址:https://blog.csdn.net/u010476739/article/details/76696756

    spring famework 配置启动方式

    本篇文章将深入探讨Spring Framework的两种主要配置启动方式:XML配置和注解配置,并通过具体的示例来阐述这两种方法。 首先,让我们从XML配置开始。在Spring早期版本中,XML配置是最常见的方式,它通过定义Bean的...

    spring boot如何指定启动端口

    Spring Boot 提供了两种方式来实现动态指定端口: 方式三-1:命令行方式 可以在命令行中使用以下命令来指定启动端口: `java -jar test.jar --server.port=8081` 这样,在启动 Spring Boot 应用程序时,端口号将...

    spring项目启动加载类到静态服务类中的三种方式.zip

    本教程将详细阐述三种不同的方式,将Spring项目启动时加载的类集成到静态服务类中。 1. **使用`ApplicationContextAware`接口** `ApplicationContextAware`是Spring提供的一个接口,它允许我们在类中注入...

    Spring启动完整流程图

    Spring启动完整流程图 Spring启动完整流程图 Spring启动完整流程图 Spring启动完整流程图 Spring启动完整流程图 Spring启动完整流程图 Spring启动完整流程图 Spring启动完整流程图 Spring启动完整流程图 Spring启动...

    SpringCloud服务启动脚本

    SpringCloud微服务架构,启动脚本,动态输出日志,并指向启动日志脚本位置。

    spring学习:依赖注入的几种方式讨论

    Spring Boot引入了一种更智能的依赖注入方式——自动配置。自动配置是通过`@EnableAutoConfiguration`注解启动的,它根据项目中的类路径和特定条件自动配置Bean。例如,如果类路径下存在`MongoClient`的jar,Spring ...

    spring boot windows 启动脚本

    spring boot windows 启动脚本

    Spring 自启动项目demo

    当Spring容器加载时,它可以自动扫描指定包下的所有类,发现带有特定注解(如@Service、@Repository、@Component等)的类,并将它们作为Bean进行实例化。这些Bean在应用程序启动时会自动创建,无需手动调用new关键字...

    spring boot/spring cloud项目启动脚本,默认名称:start.sh

    linux服务器,springboot,spring cloud、spring cloud alibaba等项目启动脚本 下载脚本, 1,上传脚本至jar包同级目录 2,更改脚本: jar包名称 项目文件路径 日志路径(包含日志名称) 脚本已配置好jvm优化...

    spring获取weblogic jndi数据源的两种方式

    ### Spring 获取 WebLogic JNDI 数据源的两种方式 在Spring框架中,通过JNDI(Java Naming and Directory Interface)可以方便地访问WebLogic服务器中的数据源。这为应用程序提供了高度解耦的数据访问机制,使得...

    Java+Spring+Spring容器启动流程方法调用xmind脑图

    1. Spring容器的启动流程 2. 循环依赖 3. Spring 中Bean的创建 4. Spring 方法xmind脑图

    spring容器启动和关闭时事件监听

    spring容器启动和关闭时事件监听;spring容器启动和关闭时事件监听;spring容器启动和关闭时事件监听

    Spring-Boot启动Demo

    **Spring Boot启动方式详解** ...理解这两种启动方式有助于你根据项目需求做出合适的选择。在实践中,你可以根据描述中的`demo-war`进一步学习和实践Spring Boot的war打包和部署过程,从而加深对这一启动方式的理解。

    spring的三种任务调度实现方式lib

    Spring提供了三种主要的任务调度实现方式:Spring内置的任务调度器(TaskScheduler),Quartz Scheduler,以及Spring Batch。下面我们将详细介绍这三种方式。 1. Spring内置的任务调度器(TaskScheduler) Spring...

    spring boot部署启动脚本

    标题中的“Spring Boot部署启动脚本”指的是在Spring Boot应用开发完成后,为了自动化部署和启动应用程序而创建的脚本。Spring Boot是一个简化Spring应用程序开发的框架,它提倡“开箱即用”的理念,使得开发者可以...

    spring和quartz的定时器的启动和停止例子

    Spring提供了一种集成Quartz的方式,使得我们可以方便地在Spring应用中管理和执行定时任务。本篇将深入探讨如何在Spring中启动和停止Quartz定时器。 首先,我们需要理解Spring和Quartz的基本概念。Spring是一个强大...

    82. Spring Boot – 启动彩蛋【从零开始学Spring Boot】

    Spring Boot – 启动彩蛋"这一主题,这属于Spring Boot框架的一部分,该框架简化了Java应用程序的创建和管理。启动彩蛋是开发人员为了增加趣味性或者隐藏信息而在软件中设置的小秘密,通常需要特定的触发条件才能...

Global site tag (gtag.js) - Google Analytics