Spring:使ServeltDispatcher Context等待直到另一个Context完成加载

时间:2017-06-22 10:34:05

标签: java spring servlets

我希望在完成上下文加载后加载DBbuildServletDispatcher,例如在ApplicationListener<ContextRefreshedEvent>事件触发消息上构建(或继续构建)AppServletDispatcher 上下文

SpringMultiDisp

换句话说,AppDispatcher Context可以等到DBbuild Context完成创作?有没有什么常见的方法可以做到这一点?

3 个答案:

答案 0 :(得分:6)

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

<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。 请参阅here,也可以使用WebApplicationContextUtils

答案 1 :(得分: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加载时创建一个上下文。

答案 2 :(得分:1)

就像任何普通的WebServlet一样,可以使用<load-on-startup>

在web.xml中对调度程序servlet的实例化进行排序

查看servlet 2.5 web.xml xsd

  

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

因此,为了首先加载DBbuildServletDispatcher,请确保其load-on-startup小于load-on-startup的{​​{1}}

AppServletDispatcher