Spring使用ref tag的local属性引用其他xml中的bean

时间:2014-08-14 12:16:44

标签: java spring inversion-of-control

我正在创建示例spring程序来理解ref tag的本地属性。

我创建了两个bean文件

第一个[applicationcontext.xml]

    <bean class="org.vik.spring.SequenceGenerator" name="sequenceProperty_Other">
         <property name="prefix">
            <ref local="prefixGeneratorOther" />
         </property>
        <property name="suffix" value="23"></property>
    </bean>

第二个xml文件[prefix_context.xml]

<bean class="org.vik.spring.DatePrefixGenerator" id="prefixGeneratorOther" p:prefix="other"/>

我已经创建了如下所示的应用上下文

ApplicationContext applicationContext  = new FileSystemXmlApplicationContext("applicationcontext.xml" ,"prefix_context.xml");

当我请求bean“sequenceProperty_Other”时,spring成功返回它

SequenceGenerator sequenceConstrutornerator = applicationContext.getBean( "sequenceProperty_Other",SequenceGenerator.class);

我从this可以理解的是,作为“prefixGeneratorOther”bean不在同一个xml文件(applicationcontext.xml)中,并且我使用local属性来引用它,Spring应该通过异常。但在我的情况下它的工作。我错过了一些东西。

的applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<!-- <bean class="org.vik.spring.SequenceGenerator" name="sequence"> </bean> -->

<bean class="org.vik.spring.DatePrefixGenerator" id="prefixGenerator"
    p:prefix="122333">

</bean>
<bean class="org.vik.spring.SequenceGenerator" name="sequenceProperty_Locale">
    <property name="prefix">
        <ref local="prefixGenerator" />
    </property>

    <property name="suffix" value="23"></property>
</bean>

<bean class="org.vik.spring.SequenceGenerator" name="sequenceProperty_Other">
    <property name="prefix">
        <ref local="prefixGeneratorOther" />
    </property>
    <property name="suffix" value="23"></property>
</bean>

prefix_context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean class="org.vik.spring.DatePrefixGenerator" id="prefixGeneratorOther"     p:prefix="other"/>

</beans>

Java类

    ApplicationContext applicationContext = new FileSystemXmlApplicationContext("applicationcontext.xml",
            "prefix_context.xml");

    System.out.println(applicationContext.getBean("prefixGenerator", PrefixGenerator.class).getPrefix());


    SequenceGenerator sequenceProperty = applicationContext.getBean("sequenceProperty_Locale",
            SequenceGenerator.class);
    System.out.println(sequenceProperty);


    SequenceGenerator sequenceConstrutornerator = applicationContext.getBean("sequenceProperty_Other",
            SequenceGenerator.class);
    System.out.println(sequenceConstrutornerator);

1 个答案:

答案 0 :(得分:2)

此特定行为适用于3.x分支中的Spring 3.1.0(包含)之后的任何版本。如果使用最新的3.0.x(3.0.7)进行测试,您将获得异常。如果你使用Spring 4进行测试,你会得到一个例外但不同的例外。

如果仔细查看Spring 3.0.7中的异常,这将引用XML解析:

at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:243)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:347)
at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:75)

这意味着限制是在xml模式级别(我相信它也是在Java代码级别)。

由于此JIRA issue,此行为在Spring 3.1.0(及之后)中已更改。从它所链接的所有JIRA问题来看,this one似乎解释了发生了什么:限制已经从3.1模式中消除了,ref local输入了一种被弃用的#34; state(因为在3.1.x和3.2.x中可以使用它)并且在Spring 4中ref local已经完全消除了。在Spring 4 the documentation says ref local is not supported anymore中,xsd架构也已更新(在ref不再接受local的意义上)。