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
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:
Sprechen Sie mit dem Autor der Elternklasse und ihn freundlich, es zu ändern fragen.
Ä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).
- 1. Spring @Transactional Annotation Verhalten
- 2. Spring Transactional Annotation
- 3. Spring Annotation-Based Interceptor
- 4. Spring Annotation @Inject funktioniert nicht
- 5. Spring 3 @Autowired Annotation Issues
- 6. Spring Security - Benutzerdefinierte PreAuthorize Annotation?
- 7. Spring Annotation @Autowired Inside-Methoden
- 8. Annotation - Wie laden Spring Konfigurationsklasse?
- 9. Inheritance Entwurf
- 10. Spring Batch-Projekt mit Annotation integriert mit Spring Batch Admin
- 11. Komponententest Annotation basiert Spring MVC Portlet-Controller
- 12. Spring @ContextConfiguration Annotation, TestNG und IDEA
- 13. Spring @Transactional Annotation Eigenschaften Vorrang/Vererbung
- 14. Wie benutzt man Spring @ Lookup Annotation?
- 15. java - Spring @Value Annotation gibt null zurück
- 16. JBoss 5.1: Spring @Resource Annotation funktioniert nicht
- 17. Warum hat Spring meine @DependsOn-Annotation ignoriert?
- 18. @Transaction Annotation für Integrationstest in Spring Boot
- 19. Parameter in Konstruktor durch Annotation in Spring
- 20. Standardwerte in Spring Bean mit Annotation
- 21. Kamel initialisieren von Spring Annotation Config
- 22. Spring CORS Controller Annotation funktioniert nicht
- 23. Spring Wert Annotation funktioniert nicht in Konstruktorargument
- 24. Annotation basierte Spring Security für REST API
- 25. Wie funktioniert die @Scheduled Annotation von Spring?
- 26. .Net Framework Inheritance Speicherverwaltung
- 27. Inheritance in Node.js
- 28. Hibernate Cascade in Inheritance
- 29. Inheritance + Foreign Keys
- 30. Python Kivy Screen Inheritance
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. –
@PunterVicky Ich habe die Antwort auf Ihre Follow-up-Frage hinzugefügt :) – ESala
Nochmals vielen Dank, ESala! –