2015-10-22 20 views
5

Ich stieß auf diese link, die erklärt, wie eine Bohne vererbt werden kann. Angenommen, dass die HelloWorld-Klasse in diesem Beispiel als Bean mit @Component-Annotation verfügbar gemacht wird, wie kann dann eine andere Bean erstellt werden, die diese Bean erbt? Kann ich extends verwenden, um die HelloWorld-Bean zu erben und @Component zur neuen Klasse hinzuzufügen, um die vorhandene Bean als neue Bean mit zusätzlichen Features zu erweitern?Spring Inheritance - Annotation

Antwort

5

Zuerst machen Sie Ihre abstrakte Konfiguration, die durch nicht Markierung als @Configuration, wie dies erreicht wird:

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

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

} 

An Sie es dann verlängern, wie folgt aus:

@Configuration 
public class ChildConfig extends ParentConfig { 

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

} 

Das Ergebnis ist genau das gleiche wie wenn Sie dies getan hätten:

@Configuration 
public class FullConfig { 

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

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

} 

bearbeiten: Antwort auf die Folgefrage in dem Kommentar.

Wenn Spring beide Klassen, Eltern und Kind, aufgreift, wird es Probleme mit duplizierten Bohnen geben, also Sie können es nicht direkt erweitern. Auch wenn Sie Methoden überschreiben, werden die Beans der Superklasse ebenfalls durch die ParentConfig instanziiert.

Da Ihre Elternklasse bereits kompiliert wird, haben Sie 2 Möglichkeiten:

  1. Sprechen Sie mit dem Autor der Elternklasse und ihn freundlich, es zu ändern fragen.

  2. Ändern Sie die @ComponentScan Pakete.

Um auf Lösung zu klären 2:

Wenn die übergeordnete Klasse in dem Paket com.parent.ParentConfig und das Kind Klasse ist das Paket com.child.ChildConfig, können Sie die Komponente Scannen so konfigurieren, dass nur Klassen untercom.child get abgeholt.

Sie können die Komponenten-Scan-Pakete mit der @ComponentScan("com.child") Annotation in Ihrer Hauptkonfigurationsdatei angeben (think application class).

+0

Danke ESala. In meinem Fall ist die Klasse, die ich erweitern möchte, Teil eines Jar und ist mit Component Annotation definiert. Ich möchte eine neue Bean erstellen, die sie erweitert und eine Methode überschreibt. –

+0

@PunterVicky Ich habe die Antwort auf Ihre Follow-up-Frage hinzugefügt :) – ESala

+0

Nochmals vielen Dank, ESala! –

Verwandte Themen