Ich brauche den Spring-Anwendungskontext von einem Nicht-Bean-Objekt. In einem anderen Thread in SO schlägt die akzeptierte Antwort vor, Singleton zu verwenden, um den Anwendungskontext zu erhalten. Spring Application-Kontext abrufen
Aber Singleton macht meinen Code mehr gekoppelt und weniger testbar, die üblichen Probleme, die in vielen Threads diskutiert werden (zB Was ist so schlimm an Singletons )
Die Frage, gibt es eine elegante Möglichkeit, den Anwendungskontext von einem Nicht-Bean-Objekt zu bekommen, ohne Singleton zu benutzen?
Es gibt immer das Bootstrapping-Problem. Für Web-Anwendungen gibt es normalerweise den äußeren Servlet-Filter, der die Situation behandelt.
Wenn es keine Web-App ist, gibt es keine Möglichkeit, einen äußeren Singleton oder Bootstrapper zu verwenden. Aber; Die Verwendung eines Singletons sollte sich nur auf die Testbarkeit dieser einzelnen Bootstrapper-Klasse auswirken. Es sollte wirklich nur sehr wenige Stellen in Ihrem Code geben, die explizit auf den Container verweisen müssen. Es erhöht also nicht wirklich die Kopplung.
Oder, um es anders auszudrücken, es sollte wirklich nur sehr wenige Nicht-Bean-Objekte geben, die auf den Federbehälter zugreifen müssen. Wenn dies nicht der Fall ist, verwenden Sie den Frühling wahrscheinlich nicht optimal. Und die meisten / alle, die den Container benötigen, sollten wahrscheinlich nur BeanFactoryAware oder ApplicationContextAware
Ich denke, Ihr Problem ist in etwa so, wie ich es vor ein paar Tagen hatte. Ich denke das folgende sollte für dich funktionieren:
Erstellen Sie zuerst eine Klasse namens AppContextManager
wie folgt:
Bezeichnen Sie die obige Klasse mit @Component
oder deklarieren Sie eine Bean für den AppContextManager in Ihrer application context xml
.
Verwenden Sie jetzt in Ihrer non-singleton
non-spring
-Instanz das folgende Code-Snippet, um ein anderes zu erhalten
Frühlingsbohne:
Und das würde Ihnen die Bean-Instanz irgendwo in Ihrem Code geben.
Tags und Links spring design-patterns singleton