Vikas Singh
Vikas Singh

Reputation: 3018

Spring referring bean present in other xml using local attribute of ref tag

I am creating sample spring program to understand, local attribute of ref tag.

I have created two bean files

first one [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>

Second xml file [prefix_context.xml]

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

I have created app context like below

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

When I request for bean "sequenceProperty_Other", spring successfully returns it

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

What I could understand from this, is that as "prefixGeneratorOther" bean in not in same xml file (applicationcontext.xml) and I am using local attribute to refer it, Spring should through exception. But in my case its working. Am I missing some thing.

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 class

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

Upvotes: 1

Views: 1736

Answers (1)

Andrei Stefan
Andrei Stefan

Reputation: 52368

This particular behavior works with any version after Spring 3.1.0 (included) in the 3.x branch. If you test this with the latest 3.0.x (which is 3.0.7) you'll get an exception. If you test with Spring 4, you'll get an exception, but a different one.

If you take a look carefully at the exception in Spring 3.0.7, this refers to XML parsing:

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)

which means the restriction is at xml schema level (and I believe it's at Java code level, as well).

This behavior has changed in Spring 3.1.0 (and after) because of this JIRA issue. From all those JIRA issue it is linked to, this one seems to explain what happened: the restriction has been eliminated from 3.1 schema and the ref local entered in a kind of "deprecated" state (because in 3.1.x and 3.2.x one can use it) and in Spring 4 ref local has been entirely eliminated. In Spring 4 the documentation says ref local is not supported anymore and, also, the xsd schema has been updated (in the sense that ref doesn't accept local anymore).

Upvotes: 2

Related Questions