Ich habe eine Instanz einer Klasse, die außerhalb von Spring erstellt wurde, dass ich Springbohnen zugreifen möchte, so dass es ein Ereignis auslösen und von Spring Beans beobachtet werden kann. Ich verwende kein Spring Web, meine Anwendung läuft von der Kommandozeile aus über Spring Boot.Spring Boot-Anwendung - Bean aus dem statischen Kontext
Antwort
Sie können Konstruktor injizieren, die Bohnen entspringen, so etwas wie:
@Service
class Bean {
...
}
class NotBean {
private Bean bean;
public NotBean(Bean bean) {
this.bean = bean;
}
// your stuff (handle events, etc...)
}
Die einzige Option, die Sie haben, ist die Feder Kontext Ihrer Anwendung mit einer statischen Methode zu belichten, so dass das Objekt, das von nicht verwaltet wird Spring kann damit Referenzen auf verwaltete Beans verwenden, die es benötigt.
Beginnen Sie mit einem Wrapper für den Kontext. Erstellen Sie eine regulär verwaltete Bean, die einen Verweis auf den Kontext in ihrem Konstruktor benötigt. Die Referenz wird auf ein statisches Klassenfeld zugeordnet, die auch eine statische Getter hat:
@Service class ContextWrapper { private static ApplicationContext context; @Autowired public ContextWrapper(ApplicationContext ac) { context = ac; } public static ApplicationContext getContext() { return context; } }
die statische Getter Einsatz im Objekt Zugang zum Kontext zu erhalten, die nicht von Spring verwaltet wird und Bezug auf Bohnen erhalten Methoden erhältlich im Kontext:
SomeBean bean = ContextWrapper.getContext().getBean("someBean", SomeBean.class); // do something with the bean
das Letzte, was Sie brauchen, ist Kommunikationskanal von Spring-beans auf nicht verwalteten Objekt. Zum Beispiel kann die
SomeBean
einen Setter verfügbar machen, der das nicht verwaltete Objekt als Parameter akzeptiert und die Referenz in einem Feld zur zukünftigen Verwendung speichert. Der Objekt-Mast ruft Verweise auf verwaltete Beans mit dem oben erwähnten statischen Kontext-Accessor ab und verwendet den Setter, um die Bean auf ihre Existenz aufmerksam zu machen.@Service class SomeBean { // ... your bean stuff private SomeClass someclass; public void setSomeClass(Someclass someclass) { this.someclass = someclass; } private void sendEventToSomeClass() { // communicate with the object not managed by Spring if (someClass == null) return; someClass.sendEvent(); } }
Wie kann ich sicherstellen, dass der Kontext nicht null oder nicht vollständig geladen ist? Kann ich mich darauf verlassen, dass getContext() den vollen Frühlingskontext zurückgibt und warum? – user7294900
Wenn Ihre Spring-Anwendung gestartet wurde, muss der Kontext korrekt erstellt werden. Das einzige, was Sie beachten müssen, ist, dass Sie die 'getContext()' - Methode nicht in Konstruktoren Ihrer Beans verwenden sollten, da die Beans-Konstruktion Teil der Kontexterstellung ist. –
Wenn ich von einer ** normalen (nicht Spring-) Klasse ** ausrufe, um eine Bohne zu bekommen, kann ich annehmen, dass der Frühlingskontext bereits begonnen hat? Muss check/function hinzugefügt werden, um sicherzustellen, dass der Spring-Kontext nicht null oder nicht vollständig geladen ist? – user7294900
- 1. Ersetzen Sie Spring Bean in einem Kontext mit Mock-Version aus einem anderen Kontext
- 2. Ausnahme, während Bean aus dem Kontext abgerufen wird, wenn der Bean-Name dynamisch übergeben wurde
- 3. ein Array von Objekten in einem Spring-Bean Kontext Deklarieren
- 4. Optional Spring-Bean Referenzen
- 5. Lädt Spring @DirtiesContext den Spring-Kontext neu?
- 6. Spring statische Initialisierung einer Bean
- 7. Spring 3.1 Bean Sichtbarkeit mit Bean Definitionsprofile
- 8. Aufrufen der statischen Methode aus der Spring-Konfiguration
- 9. Spring Bean von der statischen Methode aus einer anderen Klasse initialisieren?
- 10. Wie erstelle ich eine Spring-Bean aus einem statischen inneren Klassenkonstruktor?
- 11. Spring individuellen Kontext nicht erben Root-Kontext
- 12. Yii2: Führe eine Umleitung aus dem statischen Nicht-Controller-Kontext aus
- 13. Das Beenden des Spring-Task-Schedulers zur Laufzeit durch Entfernen der Bean-Definition aus dem Kontext funktioniert nicht
- 14. GrizzlyWebServer + Spring + Jersey + statischen Inhalt aus JAR
- 15. Spring Bean Scopes
- 16. Java Spring Recreate spezifische Bean
- 17. Spring Bean Eigenschaften persistent
- 18. eine nicht statische Methode aus einem in einem statischen Kontext
- 19. Spring MVC: Wie funktioniert Spring Bean?
- 20. Spring Custom Converter - Bean oder nicht Bean
- 21. Bedingte Abhängigkeit zwischen Beans im Spring-Kontext
- 22. Spring: @Component versus @Bean
- 23. Spring ApplicationContext-Bean-Bereich
- 24. Spring 3 Bean-Instanziierungssequenz
- 25. Spring Bean Tag Fehler
- 26. Spring Bean Zerstörungsmethode
- 27. Spring Bean destroyMethod
- 28. Spring Framework Bean Fehler
- 29. Spring MVC Bean-Konvertierung
- 30. Spring Bean Instanziierung Bestellung
Ich habe keine Kontrolle darüber, wie die anderen NotBean instanziert wird, daher kann ich nicht einfach die Bohne Bezug auf es passiert ... – Walter
Können Sie von diesem NotBean verlängern? –