2017-05-11 3 views
2

Ich entwickle auf eine Java-Core-Bibliothek, die Änderung auf ein Minimum gehalten wird, hält es eine Klasse Foo, wo Foo von einer Federauflage-Schnittstelle verwendet wird und in die Ruhe-Schnittstelle autowired.Spring Boot-Injektion von geerbten Klasse

Ich muss Foo erweitern, um eine der Methoden, die auf Foo.init() aufgerufen wird, zu überschreiben, um die Einleitung ein wenig zu ändern.

Mein FooExtend wird von einer anderen Klasse in meinem Projekt autowired, und ich hoffe, dass diese beiden zu bekommen das gleiche Objekt zu verweisen, die FooExtend Objekt, aber im Moment habe ich bekommen ein Foo-Objekt und ein FooExtend. Wie soll ich das lösen? Beispiele unten

@Component 
public class Foo{ 
    @PostConstruct 
    private void init() { 
    startStuff(); 
    } 

    protected void startStuff(){ 
    //Stuff done here 
    } 
} 

@Component 
public class FooExtend extends Foo{ 
    @PostConstruct 
    private void init() { 
    //Nothing is done here 
    } 

    @Override 
    protected void startStuff(){ 
    //Different altered stuff is done here 
    } 
} 
+0

Ich bin mir nicht sicher, ob ich Ihr Problem verstehe. Sie haben zwei Bohnen, eine Bohne mit dem Namen "foo" und eine Bohne mit dem Namen "fooExtend". Es scheint mir, dass Sie in der Lage sein sollten, @Qualifier ("fooExtend") oder @Qualifier ("foo") zusammen mit @Autowired über dem Verweis auf Foo zu verwenden, um den einen oder anderen zu starten. – MrKiller21

Antwort

0

Versuchen auszuschließen die Foo Klasse von Scan

@ComponentScan(value = {'your.package.here'}, excludeFilters = { 
    @ComponentScan.Filter(classes = { Foo.class }) 
}) 
+0

Ich kann solche Änderungen gegenüber Foo nicht machen wie im Core-Paket und sollte daher nicht geändert werden, um für andere Projekte je nach Core zu zerstören. Oder sollte ich es irgendwo in mein eigenes Paket legen? –

+0

Sie sollten dies auf Ihrem Spring-Boot (nicht im Kernpaket) hinzufügen. Wenn die App gestartet wird, wird keine Bean für die Foo.class erstellt. – StanislavL

+0

Kann das nicht funktionieren, ich bin wahrscheinlich zu freundlich in meiner Definition der Klasse, aber ich bekomme diesen Fehler dabei: 'java.lang.IllegalArgumentException: Ein Fehler trat bei der Verarbeitung eines @ComponentScan ANNOTATION Typ-Filters auf: class com.companyname.projectname.core.Foo ist nicht der Schnittstelle java.lang.annotation.Annotation' zuweisbar –

0

Es gibt zwei mögliche Antworten je nach Ihren Anforderungen:

1) Sie möchten sich registrieren beide Foo und FooExtend in Ihrem Frühlingskontext. In einem solchen Fall können Sie @Qualifier Anmerkung verwenden Sie eine Instanz oder eine andere zu injizieren:

@Autowired 
@Qualifier("fooExtend") 
Foo foo; 

2) Sie wollen nur FooExtend im Frühling Kontext registrieren.

@ComponentScan(value = {'your.package.here'}, excludeFilters = { 
@ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE, value=Foo.class)) 
} 

aber es ist erforderlich, dass Foo und FooExtend in verschiedenen Paketen sind, so dass FooExtend durch den obigen Filter NICHT exluded wird.

+0

Lösung 2 wäre die bessere Lösung, aber Foo befindet sich im Spring-Kontext von Core, was dazu führt, dass es immer noch geladen wird –

+0

Es hängt davon ab, wie Sie Beans aus Ihrer Core-Bibliothek scannen/registrieren. Wenn es @ComponentScan ist, können Sie es mithilfe von Filter ausschließen. – MrKiller21

+0

Ich konnte es nicht funktionieren lassen. Es gab mir den folgenden Fehler: 'java.lang.IllegalArgumentException: Bei der Verarbeitung eines @ComponentScan ANNOTATION-Typ-Filters ist ein Fehler aufgetreten: Klasse com.companyname.projectname.core.Foo ist nicht zu Schnittstelle java.lang.annotation.Annotation zuweisbar –

Verwandte Themen