2011-11-25 14 views
7

<bean parent="someParent">を@Componentアノテーション(アノテーションを使用してスプリングビーンを作成する)に使用する方法はありますか?@Component with parent?

私は@componentアノテーションを使用して "spring parent"を持つspring beanを作成したいと思います。

は可能ですか?

+4

は、あなただけの継承を使用することはできませんか?ベースクラスのオートワイヤリングも同じように動作します。 –

+1

@Tomasz Nurkiewicz私は、XMLで定義されたスプリング親ビーンを持っています(それはいくつかのプロパティが "デフォルト"の値に設定されています)。それは私が変えることのできるものではありません。 – IAdapter

+0

私は私の考えをさらに説明する答えを加えました。あなたのニーズに合わない理由をもう少し詳しく説明できますか? XMLで親定義を変更できないのはなぜですか?アノテーションから親を参照することはできません... –

答えて

3

私のコメントに続いて、XML

<bean id="base" abstract="true"> 
    <property name="foo" ref="bar"/> 
</bean> 

<bean class="Wallace" parent="base"/> 
<bean class="Gromit" parent="base"/> 

のこの作品は、多かれ少なかれeqivalentこのコード(春抽象Beanがclassを必要としないので、私は人工Baseクラスを作成したことに注意してください)にある:

public abstract class Base { 
    @Autowired 
    protected Foo foo; 
} 

@Component 
public class Wallace extends Base {} 

@Component 
public class Gromit extends Base {} 

WallaceGromitは現在共通のFooプロパティにアクセスできます。それを無効にすることもできます(例: @PostConstructにあります。

私は実際にXMLのparentという機能を嫌にしていましたが、DRYを維持することができましたが、Javaのアプローチはよりクリーンであるようです。これは私が持っていることができるものである

- (コンポーネント・スキャンにより注入した潜在的な実施のためのcontext.xml-宣言で豆を使用し、一般的な抽象親クラス)

+3

人工の 'Bean'クラスと' Wallace'と 'Gromit 'を生成するか否かにかかわらず、' base' beanをXMLで定義すると、 'はコンポーネントスキャンによって作成されます。 –

0

ちょうど同じ構築物に出くわしました。.. @Componentクラスで行わ:私は(それは注射はないクラスのオブジェクト上で動作することを明らかにしているので、より良い)やってしまった..what

@Autowired 
public void setBeanUsedInParent(BeanUsedInParent bean) { 
    super.setBeanUsedInParent(bean); 
} 

- あなたは変更することができれば親クラス:

// abstract getter in parent Class 
public abstract BeanUsedInParent getBeanUsedInParent(); 

実際の実装(@Componentクラス)までの実際の豆だけでなく、その注入..leave:

@Autowired 
private BeanUsedInParent beanUsedInParent; 

@Override 
public BeanUsedInParent getBeanUsedInParent() { 
    return this.beanUsedInParent; 
}