【问题标题】:Spring: Make ServeltDispatcher Context await until another Context finish loadingSpring:使ServeltDispatcher Context等待直到另一个Context完成加载
【发布时间】:2017-06-22 10:34:05
【问题描述】:

我想在完成 Context 加载后加载 DBbuildServletDispatcher,例如在 ApplicationListener<ContextRefreshedEvent> 事件触发消息以构建(或继续构建)AppServletDispatcher Context

换句话说,AppDispatcher Context 可以等到完成DBbuild Context 的创建吗?有什么常用的方法吗?

【问题讨论】:

  • 您可以将 App 上下文标记为 DB 上下文的子级。我不确定这是否是正确的做法,但 App 上下文肯定会等待 DB。
  • 您需要为 DBbuild Context 添加 1 和为 AppDispatcher 添加 2在你的 web.xml 中的上下文来实现这一点。

标签: java spring servlets


【解决方案1】:

这很简单。请记住,参数范围有两种类型 - 上下文参数和 servlet 的初始化参数。您需要的是在加载子上下文之前必须初始化所有依赖项。这里DBbuildServletDispatcher应该在父上下文中初始化,即ApplicationContext,而AppServletDispatcherWebApplicationContext,即应用上下文的子上下文

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/spring/DBbuildServletDispatcher.xml
    </param-value>
</context-param>



<servlet>
    <servlet-name>firstServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/AppServletDispatcher.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>my-servlet</servlet-name>
    <url-pattern>/abc/* </url-pattern>
</servlet-mapping>

带有上下文参数的第一部分加载上下文文件并创建ApplicationContext。第二部分定义了 WebApplicationContext。 也可以参考hereWebApplicationContextUtils

【讨论】:

    【解决方案2】:

    这样的事情可能会奏效。您只加载 DBbuildContext.xml (applicationContext.xml)

    添加此行后:

    <bean id="eventListenerBean" class="a.b.c.ApplicationListenerBean" />
    

    然后,定义一个类

    package a.b.c;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationEvent;
    import org.springframework.context.ApplicationListener;
    import org.springframework.context.event.ContextRefreshedEvent;
    
    public class ApplicationListenerBean implements ApplicationListener {
    
        @Override
        public void onApplicationEvent(ApplicationEvent event) {
            if (event instanceof ContextRefreshedEvent) {
                ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("appServletContext.xml");
    
            }
        }
    }
    

    现在 appServletContext.xml 只会在加载 dbBuildContext.xml 时创建上下文。

    【讨论】:

      【解决方案3】:

      就像任何普通的 WebServlet 一样,调度器 servlet 的实例化可以在 web.xml 中使用&lt;load-on-startup&gt; 进行排序

      看着servlet 2.5 web.xml xsd

      load-on-startup 元素表明这个 servlet 应该是 在启动时加载(实例化并调用它的 init()) Web应用程序。这些元素的可选内容必须是 指示应加载 servlet 的顺序的整数。如果 该值是一个负整数,或者该元素不存在, 容器可以随时选择加载 servlet。如果 value 是一个正整数或 0,容器必须加载并且 在部署应用程序时初始化 servlet。容器 必须保证加载标有小整数的 servlet 在标有更高整数的 servlet 之前。容器可以选择 加载启动时加载值相同的 servlet 的加载顺序。

      所以为了首先加载DBbuildServletDispatcher,确保它的load-on-startup小于AppServletDispatcherload-on-startup

      <servlet>
          <servlet-name>DBbuildServletDispatcher</servlet-name>
          <servlet-class>com.foo.DBbuildServletDispatcher</servlet-class>
          <load-on-startup>0</load-on-startup>
      </servlet> 
      <servlet>
          <servlet-name>AppServletDispatcher</servlet-name>
          <servlet-class>com.foo.AppServletDispatcher</servlet-class>
          <load-on-startup>1</load-on-startup>
      </servlet>
      

      【讨论】:

        猜你喜欢
        • 2014-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-02
        • 1970-01-01
        • 2021-07-21
        • 1970-01-01
        相关资源
        最近更新 更多