如何在Spring中引用另一个XML文件中的bean

45

我在一个xml文件中定义了一个Spring bean。我想从另一个xml文件中引用它。我该怎么做呢?

6个回答

59
你有几个选择:

导入

<import resource="classpath:config/spring/that-other-xml-conf.xml"/>

<bean id="yourCoolBean" class="org.jdong.MyCoolBean">
    <property name="anotherBean" ref="thatOtherBean"/>
</bean>

将其包含在ApplicationContext构造中

在创建ApplicationContext时,将两个文件都作为其一部分 => 然后就不需要导入了。

例如,如果您需要在测试期间使用它:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:META-INF/conf/spring/this-xml-conf.xml",
                    "classpath:META-INF/conf/spring/that-other-xml-conf.xml" })
public class CleverMoneyMakingBusinessServiceIntegrationTest {...}

如果是 Web 应用程序,则可以在 web.xml 文件中完成:

<context-param> 
    <param-name>contextConfigLocation</param-name>
    <param-value>WEB-INF/conf/spring/this-xml-conf.xml</param-value>
    <param-value>WEB-INF/conf/spring/that-other-xml-conf.xml</param-value>
</context-param>

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

如果它是一个独立的应用程序、库等,您需要这样加载您的 ApplicationContext

new ClassPathXmlApplicationContext( 
    new String[] { "classpath:META-INF/conf/spring/this-xml-conf.xml",
                   "classpath:META-INF/conf/spring/that-other-xml-conf.xml" } );

语法问题?@ContextConfiguration(locations={"base-context.xml"}) - Kalpesh Soni
4
对我来说,“web.xml”块会引发错误。一个“param-value”似乎只允许出现在某个位置上。 - Peter Butkovic
对于导入:如果XML文件在同一个应用程序中定义,我们是否可以使用“ref”访问另一个XML文件中的bean,而不使用<import>参考 - laahaa

7

只需使用 <import resource="otherXml.xml"> 导入定义bean的xml文件,就能使用该bean的定义。

resource 属性中可以使用 classpath:

<import resource="classpath:anotherXXML.xml" />

请参阅Spring参考文档中的本章“3.18将bean定义从一个文件导入到另一个文件”

我已经这样做了,但是刷新后,系统陷入了无限状态。我做错了什么吗? - Jeffrey.W.Dong
Spring没有跟踪任何异常,或者关于它在无限状态下做什么的信息吗?此外,请查看@JBNizet的建议,只有在这些xml不是同一个应用程序上下文的一部分时才需要这样做。请参阅2.5参考手册中的“3.2.2.1.组合基于XML的配置元数据”部分。 (我在答案中提供的链接可能是某个过时的Spring版本)。 - Xavi López

5

您可以像在同一XML文件中引用Bean一样引用它。如果Spring上下文由多个XML文件组成,则所有Bean都是该上下文的一部分,因此共享唯一的命名空间。


3

如果你只是将bean重构到几个文件中,以避免单个xml文件过大,那么可以直接从当前文件夹中引用它:

<import resource="processors/processor-beans.xml"/>

1

您还可以通过在代码中加载多个Spring Bean配置文件来实现此操作:

ApplicationContext context = new ClassPathXmlApplicationContext(
    new String[] {"Spring-Common.xml", "Spring-Connection.xml","Spring-ModuleA.xml"});

将所有的Spring XML文件放置在项目类路径下:
project-classpath/Spring-Common.xml
project-classpath/Spring-Connection.xml
project-classpath/Spring-ModuleA.xml

然而,上述实现缺乏组织并容易出错,更好的方法应该是将所有Spring bean配置文件组织到一个单独的XML文件中。例如,创建一个名为Spring-All-Module.xml的文件,并像这样导入整个Spring bean文件:
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <import resource="common/Spring-Common.xml"/>
    <import resource="connection/Spring-Connection.xml"/>
    <import resource="moduleA/Spring-ModuleA.xml"/>

</beans>

现在您可以像这样加载单个xml文件:

ApplicationContext context = 
    new ClassPathXmlApplicationContext(Spring-All-Module.xml);

注意 在Spring3中,另一种解决方案是使用JavaConfig @Import

0

tolitius提供的答案非常详细。 只是Peter Butkovic提到的问题。

对我来说,web.xml块会抛出错误。一个param-value似乎只允许在一个地方。- Peter Butkovic

我遇到了同样的问题,并通过在同一个中使用“,”分割两个路径来解决它。

它看起来像这样

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml,
                     /WEB-INF/daoContext.xml
        </param-value>
    </context-param>

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