2011-08-04 9 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; 
    } 
} 

applicationContext.xmlをSRC /メイン/リソースから:

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

} 

私は@AutowiredとTestParentから親プロパティに注釈を付ける場合は、親の種類の対象となる2つの豆があるので、問題があります。

applicationContext.xmlでテストBeanを明示的に宣言すると、アサーションが失敗し、注入が失敗します。

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

答えて

2

私は、注釈なしでストレートXMLスプリング構成を使用しています。あなたのケースでは、私はちょうど名前でautowireに指定します。私は、@Qualifierを使って同様の効果(タイプではなく名前で配線)を実現できるアノテーションを信じています。

+0

おかげで、今では私にとっては明らかです。 – DaJackal

1

受け入れ答えは間違いなく正しいですが、あなたはまた、あなたの春のxmlファイルに次のように使用して検討するかもしれない:

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

はその後、プロパティは、例えば、正しい名前/値のペアを持つファイルを貼り付けた場合

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

あなたは春の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