Spring:使ServeltDispatcher上下文等待另一个上下文完成加载

7
我希望在Context加载完成后加载DBbuildServletDispatcher,例如在ApplicationListener<ContextRefreshedEvent>事件触发消息时建立(或继续建立)AppServletDispatcherContext
换句话说,AppDispatcher Context是否可以等待创建完DBbuild Context?有没有常见的做法?
以下是图片:SpringMultiDisp

您可以将应用程序上下文标记为数据库上下文的子级。我不确定这是否是正确的做法,但应用程序上下文肯定会等待数据库上下文。 - M. Prokhorov
你需要在web.xml中为DBbuild Context添加<load-on-startup>1</load-on-startup>,并为AppDispatcher Context添加<load-on-startup>2</load-on-startup>,以实现此功能。 - Rohit Gaikwad
3个回答

6

很简单。记住参数范围有两种类型 - 上下文参数和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。 请参考此处,也可以使用WebApplicationContextUtils


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");

        }
    }
}

现在,只有在dbBuildContext.xml加载完成后,appServletContext.xml才会创建上下文。

1

和任何普通的WebServlet一样,调度程序Servlet的实例化可以使用<load-on-startup>在web.xml中进行排序

查看servlet 2.5 web.xml xsd

load-on-startup元素表示此Servlet应该在Web应用程序启动时加载(实例化并调用其init())。此元素的可选内容必须是一个整数,指示应加载Servlet的顺序。如果值为负整数或元素不存在,则容器可以自由选择何时加载Servlet。如果值为正整数或0,则容器必须在应用程序部署时加载和初始化Servlet。容器必须保证标有较低整数的Servlet在标有较高整数的Servlet之前加载。容器可以选择具有相同load-on-start-up值的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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接