2015-10-22 15 views
5

私はこのlinkに出会い、どのようにしてBeanを継承できるかを説明しました。この例のHelloWorldクラスが@Componentアノテーションを使用してBeanとして公開されていると仮定すると、このBeanを継承する別のBeanを作成する方法はありますか? HelloWorld Beanを継承するためにextendsを使用し、新しいクラスに@Componentを追加して、既存のBeanを拡張して追加の機能を持つ新しいBeanとして公開することはできますか?春の継承 - 注釈

答えて

5

まず、あなたは、このように、@Configurationとしてそれをマークするないによって達成され、あなたの抽象設定を、作る:

// notice there is no annotation here 
public class ParentConfig { 

    @Bean 
    public ParentBean parentBean() { 
     return new ParentBean(); 
    } 

} 

Anが、あなたはこのように、それを拡張:

@Configuration 
public class ChildConfig extends ParentConfig { 

    @Bean 
    public ChildBean childBean() { 
     return new ChildBean(); 
    } 

} 

結果は次の場合とまったく同じになります。

@Configuration 
public class FullConfig { 

    @Bean 
    public ParentBean parentBean() { 
     return new ParentBean(); 
    } 

    @Bean 
    public ChildBean childBean() { 
     return new ChildBean(); 
    } 

} 

編集:コメントでフォローアップの質問への答え。

春が親子の両方のクラスを拾うと、重複した豆に問題が発生するので、を直接拡張することはできません。メソッドをオーバーライドしても、スーパークラスのBeanはParentConfigによってインスタンス化されます。

あなたの親クラスがすでにをコンパイルされているので、あなたは2つのオプションがあります:親クラスの作者に

  1. の話をし、親切にそれを変更するために彼に尋ねます。

  2. @ComponentScanパッケージを変更してください。溶液2に明確にする

:親クラスがパッケージcom.parent.ParentConfigと子クラスである場合

がパッケージcom.child.ChildConfigで、あなたはcom.childクラスのみれるように、コンポーネントのスキャンを設定することができますGET拾った。

メインの構成ファイル(アプリケーションクラスと考える)の@ComponentScan("com.child")アノテーションを使用して、コンポーネントスキャンパッケージを指定できます。

+0

ありがとうございます。私の場合、私が拡張しようとしているクラスはjarの一部であり、Componentアノテーションで定義されています。私はそれを拡張し、1つのメソッドをオーバーライドする新しいBeanを作成したい。 –

+0

@PunterVicky私はあなたのフォローアップの質問への答えを追加しました:) – ESala

+0

ありがとう、ESala! –