我希望在完成上下文加载后加载DBbuildServletDispatcher
,例如在ApplicationListener<ContextRefreshedEvent>
事件触发消息上构建(或继续构建)AppServletDispatcher
上下文
换句话说,AppDispatcher Context
可以等到DBbuild Context
完成创作?有没有什么常见的方法可以做到这一点?
答案 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>
load-on-startup元素指示此servlet应该是 在启动时加载(实例化并调用其init()) Web应用程序。这些元素的可选内容必须是 整数,指示应加载servlet的顺序。如果 该值是一个负整数,或者该元素不存在, 容器可以随时加载servlet。如果 value是一个正整数或0,容器必须加载和 在部署应用程序时初始化servlet。容器 必须保证加载标有较低整数的servlet 在用更高整数标记的servlet之前。容器可以选择 具有相同加载启动值的servlet的加载顺序。
因此,为了首先加载DBbuildServletDispatcher
,请确保其load-on-startup
小于load-on-startup
的{{1}}
AppServletDispatcher