Procurez-vous d'un Listener chargé le contexte du printemps
Question
J'ai une application web qui charge un contexte de printemps de façon standard:
web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:META-INF/applicationContext.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
Malheureusement, mon application n'est pas une application web « pure », ce qui signifie que je n'ai pas vraiment la fin de l'avant, mais seulement des acteurs distants qui se Akka initialisés par un web.xml Listener ainsi. Mes acteurs (Akka) de POJO standards doit saisir le contexte du printemps, donc ma question est: comment puis-je mettre la main sur le contexte du printemps d'une classe qui n'a pas de référence au contexte Servlet
En fait, je ne peux pas utiliser:
WebApplicationContextUtils.getWebApplicationContext(ctx);
... parce que les acteurs ont Akka aucune référence au ServletContext.
Merci.
La solution
Vous pouvez faire votre propre Initializer qui permettra de créer une instance d'un SpringContextActor avec un identifiant bien connu, et les acteurs ont besoin de faire quelque chose avec le SpringContext peut regarder la SpringContextActor dans les messages ActorRegistry et envoyer.
Autres conseils
-
Si ces POJO sont les haricots de printemps, vous pouvez les faire mettre en œuvre
ApplicationContextAware
-
Vous pouvez utiliser
@Configurable
pour faire de POJO un grain de printemps -
Si elles ne sont pas des grains de printemps, vous pouvez stocker les
ServletContext
dans JNDI au démarrage et l'accès via JNDI.
Je me demande au sujet d'un design qui dépendait si fortement sur le niveau Web.
L'idiome de printemps recommandé est d'avoir une couche de service d'interface POJO qui est appelée à partir du niveau Web. L'avantage est que la couche de service peut être utilisé même si le niveau Web est complètement supprimé.
Si vous ne disposez pas d'une couche de service, en ajoutant peut-être on pourrait vous donner la possibilité de l'utiliser sans le niveau de serveur Web ou application.