Den Spring Application-Kontext von einem Nicht-Bean-Objekt abrufen, ohne Singleton zu verwenden

9

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?

    
LiorH 24.01.2009, 09:28
quelle

2 Antworten

7

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

    
krosenvold 24.01.2009, 09:43
quelle
8

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:

%Vor%

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:

%Vor%

Und das würde Ihnen die Bean-Instanz irgendwo in Ihrem Code geben.

    
mickeymoon 10.10.2012 08:58
quelle