Spring 上下文层次结构与 Web 应用程序上下文

发布于 2024-11-08 01:00:59 字数 1416 浏览 0 评论 0原文

我正在处理一个使用 DispatcherServlet 引导的 Spring MVC Web 应用程序。它创建一个管理整个应用程序的 XmlWebApplicationContext

<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

现在有一些模块应该在运行时使用 ContextSingletonBeanFactoryLocator 加载。因此,每个模块都有自己的ClasspathXmlApplicationContext。为了使模块可以从 XmlWebApplicationContext 引用 beans,它应该附加到 XmlWebApplicationContext 以形成一个上下文层次结构,其中 XmlWebApplicationContext 应该扮演父上下文的角色和模块的 ClasspathXmlApplicationContext 子上下文的角色。不幸的是,我无法使用连接它们,

<beans>
    <bean id="moduleContext"
        class="org.springframework.context.support.ClassPathXmlApplicationContext">
        <constructor-arg>
            ...
        </constructor-arg>
        <constructor-arg ref="parentContext" />
    </bean>
</beans>

因为到目前为止我还没有找到为 WebApplicationContext 命名 parentContext 的方法。我是否忽略了某些事情,或者是否有更好/更简单的方法以不同的方式实现相同的目标?

I'm dealing with a Spring MVC web app that's bootstrapped using a DispatcherServlet. It creates a XmlWebApplicationContext which manages the whole application:

<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

Now there are some modules that should be loaded at runtime using a ContextSingletonBeanFactoryLocator. Therefore every module has its own ClasspathXmlApplicationContext. So that a module could reference beans from the XmlWebApplicationContext, it should be attached to the XmlWebApplicationContext to form a Context Hierarchy wherein the XmlWebApplicationContext should play the role of the parent and the ClasspathXmlApplicationContext of the module the role of the child context. Unfortunately I'm unable to connect them using

<beans>
    <bean id="moduleContext"
        class="org.springframework.context.support.ClassPathXmlApplicationContext">
        <constructor-arg>
            ...
        </constructor-arg>
        <constructor-arg ref="parentContext" />
    </bean>
</beans>

because I've found no way so far to give the WebApplicationContext the name parentContext. Have I overlooked something or is there a better/easier way to achieve the same in a different fashion?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

多像笑话 2024-11-15 01:00:59

如果您正在使用注释,您可以这样做:

@Inject
private XmlWebApplicationContext context;

@Inject
private List<ClassPathXmlApplicationContext> childs;

@PostConstruct
public void refreshContext() {
    for(ClassPathXmlApplicationContext appContext : childs) {
        appContext.setParent(context);
    }
    context.refresh();
}

您也可以在没有注释的情况下通过使用接口 InitializingBean 和 ApplicationContextAware 来完成此操作。

已编辑: childs 按类型自动装配,因此 Spring 将注入作为 ClassPathXmlApplicationContext 实例的所有 bean。

If you are using annotations, you can do this:

@Inject
private XmlWebApplicationContext context;

@Inject
private List<ClassPathXmlApplicationContext> childs;

@PostConstruct
public void refreshContext() {
    for(ClassPathXmlApplicationContext appContext : childs) {
        appContext.setParent(context);
    }
    context.refresh();
}

You can do it without annotations too, by using the interfaces InitializingBean and ApplicationContextAware.

Edited: childs is autowired by type, so Spring will inject all the bean that are being an instance of ClassPathXmlApplicationContext.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文