2010-04-06 13 views
5

Desidero utilizzare sia ContextLoaderListener (in modo che possa passare Spring Beans al mio servlet) che DispatchServlet (Spring MVC). Tuttavia, attualmente devo passare init param a questi sia initializer classe:Utilizzare un ContextLoaderListener in conformità con DispatchServlet

<param-name>contextConfigLocation</param-name> 
<param-value> 
    /WEB-INF/spring/app-config.xml 
</param-value> 

Quindi, io uso lo stesso XML per queste due classi. Mi chiedo se questo potrebbe portare all'inizializzazione dei miei fagioli due volte? Se sì, come farei per evitarlo?

risposta

12

Per entrambi ContextLoaderListener e DispatcherServlet, il parametro contextConfigLocation è facoltativo.

ContextLoaderListener predefinito su /WEB-INF/application.xml, DispatcherServlet predefinito su /WEB-INF/servletname-servlet.xml.

Se si impostano questi parametri in modo esplicito, è necessario non impostarli sullo stesso valore. I modelli ContextLoaderListener e DispatcherServlet devono avere contesti con diversi set di definizioni di bean, poiché altrimenti, come dici tu, i bean verranno istanziati due volte.

+1

Quindi, non c'è modo per questi due a condividere lo stesso insieme di fagioli? –

+1

@Phuong: i bean del servlet avranno accesso ai bean nel contesto caricato dal listener. I contesti formano una relazione genitore-figlio. I fagioli sono "posseduti" dal genitore, ma visibili al bambino – skaffman

+0

Hmm, ho letto uno dei tuoi post qui: http://stackoverflow.com/questions/1464881/defaultannotationhandlermapping-via-contextloaderlistener-instead-of-dispatcherse, e il problema è stato spiegato molto più pulito. Cercherò di vedere se posso evitare di duplicare i miei fagioli. Grazie. –

6

per forzare DispatcherServlet uso inizializzazione contesto da ContextLoaderListener si dovrebbe impostare contextConfigLocation come vuoto:

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     classpath:spring-context.xml 
    </param-value> 
</context-param> 

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<servlet> 
    <servlet-name>dispatcherServlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value></param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>dispatcherServlet</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 
Problemi correlati