2011-08-04 175 views
0

我想一些屬性注入到一個父類和子類,我面臨的一些問題。我想要從子項訪問已注入的commonAddress屬性,但是同時我想在子項中注入相對路徑。依賴注入繼承樹

的父類:

public class Parent { 
    private String commonAddress; 

    public void setCommonAddress(String commonAddress) { 
     this.commonAddress = commonAddress; 
    } 
} 

的子類:

public class Child1 extends Parent { 
    private String relativePath; 

    public void setRelativePath(String relativePath) { 
     this.relativePath = relativePath; 
    } 
} 

從的src/main /資源的applicationContext.xml:

<bean id="parentBean" class="package.Parent"> 
    <property name="commonAddress" ref="commonAddressString"/> 
</bean> 

<bean id="childBean" class="package.Child1"> 
    <property name="relativePath" ref="relativePathString"/> 
</bean> 

的從testApplicationContext.xml src/test/resources:

<bean id="commonAddressString" class="java.lang.String"> 
    <constructor-arg> 
     <value>CommonAddressValue</value> 
    </constructor-arg> 
</bean> 

<bean id="relativePathString" class="java.lang.String"> 
    <constructor-arg> 
     <value>RelativePathValue</value> 
    </constructor-arg> 
</bean> 

測試類:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "classpath:/applicationContext.xml" }) 
public class TestParent { 

    private Parent parent; 

    public void setParent(Parent parent) { 
     this.parent = parent; 
    } 

    @Test 
    public void testParentInjectionInTestClass(){ 
     Assert.assertNotNull(parent); 
    } 

} 

如果我從註釋與TestParent的@Autowired parent屬性,還有一個問題,因爲有2種豆有資格父類型。

如果我顯式聲明的applicationContext.xml測試豆,斷言失敗,所以注射是不成功的。

<bean id="testParent" class="package.TestParent"> 
    <property name="parent" ref="parentBean"></property> 
</bean> 

回答

2

我正在使用不帶註釋的直接XML Spring配置。在你的情況下,我只是指定按名稱自動裝配。我相信,使用@Qualifier可以達到相同的效果(按名稱而不是按類型進行佈線)。

+0

謝謝,現在很清楚我。 – DaJackal

1

接受的答案肯定是正確的,但你也可以考慮使用你的Spring XML文件中的以下內容:

<context:property-placeholder location="classpath:/app.properties" /> 

然後假設你把一個屬性與例如正確的名稱/值對文件

common.address.value=some value 
relative.path.value=some/path/value 

你可以做這樣的事情在你的Spring XML:

<bean id="parentBean" class="package.Parent"> 
    <property name="commonAddress" value="${common.address.value}"/> 
</bean> 

<bean id="childBean" class="package.Child1"> 
    <property name="relativePath" ref="${relative.path.value}"/> 
</bean> 
+0

這是一個非常好的主意。謝謝 – DaJackal