2017-06-22 17 views
7

Chciałbym załadować DBbuildServletDispatcher, po ukończeniu Context załadunek, np na ApplicationListener<ContextRefreshedEvent> wiadomości ognia zdarzenie zbudować (lub kontynuować budynek) AppServletDispatcherKontekstWiosna: Marka ServeltDispatcher Kontekst czekają aż innej załadunku mety Kontekst

SpringMultiDisp

Innymi słowy można AppDispatcher Context czekać do zakończenia tworzenia DBbuild Context? Czy są jakieś typowe sposoby robienia tego?

+0

Można zaznaczyć kontekst aplikacji jako dziecko kontekście DB. Nie jestem pewien, czy to jest właściwe, ale kontekst aplikacji zdecydowanie czekałby na DB. –

+0

Musisz dodać 1 dla kontekstu DBbuild i 2 dla kontekstu AppDispatcher w twoim web.xml do osiągnąć to. –

Odpowiedz

6

To jest proste. Pamiętaj, że zakres paramatyki jest dwojakiego rodzaju - parametr kontekstu i początkowy parametr serwletu. Potrzebne są wszystkie zależności, które należy zainicjować przed załadowaniem kontekstu podrzędnego. Tutaj DBbuildServletDispatcher powinny zostać zainicjowane w kontekście dominującego, czyli ApplicationContext i AppServletDispatcher jest WebApplicationContext który jest kontekst dziecko kontekstu aplikacji

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     /WEB-INF/spring/DBbuildServletDispatcher.xml 
    </param-value> 
</context-param> 



<servlet> 
    <servlet-name>firstServlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring/AppServletDispatcher.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>my-servlet</servlet-name> 
    <url-pattern>/abc/* </url-pattern> 
</servlet-mapping> 

Pierwsza część z kontekstu param ładuje plik kontekstowe i tworzyć ApplicationContext. Druga część definiuje WebApplicationContext. Refer here i WebApplicationContextUtils mogą również być wykorzystywane.

2

Coś takiego może działać. Załadować tylko DBbuildContext.xml (applicationContext.xml)

po dodaniu tej linii:

<bean id="eventListenerBean" class="a.b.c.ApplicationListenerBean" /> 

Następnie zdefiniować klasę

package a.b.c; 

import org.springframework.context.ApplicationContext; 
import org.springframework.context.ApplicationEvent; 
import org.springframework.context.ApplicationListener; 
import org.springframework.context.event.ContextRefreshedEvent; 

public class ApplicationListenerBean implements ApplicationListener { 

    @Override 
    public void onApplicationEvent(ApplicationEvent event) { 
     if (event instanceof ContextRefreshedEvent) { 
      ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("appServletContext.xml"); 

     } 
    } 
} 

Teraz appServletContext.xml stworzy tylko kontekst po załadowaniu pliku dbBuildContext.xml.

1

Podobnie jak każdy normalny WebServlet, konkretyzacja dyspozytorski serwlety można zamówić w web.xml za pomocą <load-on-startup>

Patrząc na servlet 2.5 web.xml xsd

Element obciążenie na starcie oznacza, że ​​aplet ten powinien be Załadowano (utworzono instancję i wywołano funkcję init()) podczas uruchamiania aplikacji internetowej . Opcjonalna zawartość tych elementów musi być liczbą całkowitą określającą kolejność, w jakiej serwlet powinien być załadowany. Jeśli wartość jest ujemną liczbą całkowitą lub element nie jest obecny, kontener może załadować serwlet, gdy tylko wybierze. Jeśli wartość jest dodatnią liczbą całkowitą lub 0, kontener musi zostać załadowany, a zainicjować serwlet podczas wdrażania aplikacji. Kontener musi zagwarantować, że serwlety oznaczone niższymi liczbami całkowitymi zostaną załadowane przed serwletami oznaczonymi wyższymi liczbami całkowitymi. Kontener może wybrać kolejność ładowania serwletów z tą samą wartością przy rozruchu.

Więc Inorder dla DBbuildServletDispatcher być najpierw załadowane, upewnij się, że jego load-on-startup jest mniejsza niż load-on-startup od AppServletDispatcher

<servlet> 
    <servlet-name>DBbuildServletDispatcher</servlet-name> 
    <servlet-class>com.foo.DBbuildServletDispatcher</servlet-class> 
    <load-on-startup>0</load-on-startup> 
</servlet> 
<servlet> 
    <servlet-name>AppServletDispatcher</servlet-name> 
    <servlet-class>com.foo.AppServletDispatcher</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet>