2013-07-04 11 views
8

Teraz przyjść bezpośrednio do mojego punktu,Jak zainicjować aplikację na wiosnę?

W JSP zrobię proces inicjalizacji mojego wniosku jak,

<%! public void jsp_init(){ 

     //Initialise the domain server to create protocol 
     //Create the logging file 
}%> 

Teraz mam zamiar odbudować mój poprzedni wniosek z Servlets do Spring 3.2.

Jak mogę to zrobić z Spring 3.2?

Jeden z moich colleague powiedział, żebym to zrobił initialization with Constructor of the Spring Controller.

Bo stworzyli fasoli dla controller class w applicationContext.xml i wczytuję witka applicationContext.xml plików ContextLoadListner w web.xml.

Czy to jest właściwy sposób inicjowania?

Co na temat aplikacji ApplicationListener na wiosnę?

Jaki jest najlepszy sposób na zainicjowanie aplikacji pod numerem spring 3.2?

Mam nadzieję, że nasi użytkownicy stosów dadzą dobre rozwiązanie.

Odpowiedz

8

Wiosna zrobi wiele dla Ciebie, jeśli są prawidłowo skonfigurowane. Jeśli naprawdę potrzebujesz wykonać kod (zamiast używać czegoś, co automatycznie skonfiguruje się jak Log4J), sugerowałbym rejestrację InitializingBean i przesłonięcie afterPropertiesSet. Następnie będzie dodać tę definicję fasoli do pliku applicationContext.xml:

<bean id="initializer" class="com.myproject.MyInitializer" /> 

W rezultacie Wiosna wywoła metodę gdy wniosek został w pełni zainicjowany. Alternatywnie można użyć adnotacji @PostConstruct na komponencie bean, który został zarejestrowany w kontekście aplikacji, ale nie ma gwarancji, że reszta aplikacji zostanie zainicjowana po wywołaniu tej metody. Jeśli chcesz, aby uruchamiał się, gdy wszystko zostało skonfigurowane, metoda Initializing Bean jest drogą do zrobienia.Użyłem tej strategii, aby uruchomić gniazdo serwera itp., Które musi działać niezależnie od cyklu życia żądania sieci.

+0

dziękuję za odpowiedź. Wasz o swojej opinii z odpowiedzią. http://stackoverflow.com/questions/8686507/how-to-add-a-hook-to-the-application-context-initialization-event –

+0

@KitePlayer To też by działało. To zależy od tego, czy musisz być powiadamiany o wielu typach zdarzeń aplikacji, czy tylko o starcie. –

+0

Muszę wykonać pewne zadanie, tylko raz po rozpoczęciu mojego tomcat ... jaki jest najlepszy sposób na to? –

0

Możesz to zrobić, mając fasolę z @PostConstruct i wstrzykując w swoim servlet-config na wiosnę. Spójrz na kod here i jedną z linii na dole.

<beans:bean id="PlayerImportDaoImpl" 
     class="com.footieview.app.importer.dao.PlayerImportDaoImpl" /> 

Ten wstrzyknie tej fasoli przy starcie metoda na tej fasoli ma adnotacji @PostConstruct - to znaczy przy uruchamianiu ta metoda jest wywoływana.

6

Dlaczego warto zainicjować aplikację wiosenną samodzielnie? Wiosna automatycznie zrobi dla Ciebie: ten sposób można powiedzieć serwer zainicjować sprężynę:

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

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

To będzie się działo podczas deploymentand wszystkie ziarna są definiowane nie zostanie zainicjowany (w zależności od lenistwa). Jeśli naprawdę chcesz coś zrobić, gdy fasola jest inicjowany, przed Wykorzystanie następnie użyć InitializingBean Przykładem może być

MyBean implements InitializingBean{ 
    afterPropertiesSet() { 

     //do here 
    } 

} 
+0

To nie może być dobrym pomysłem, aby zainicjować aplikacji przez 'ContextLoaderListener'. Lepiej jest skonfigurować 'DispatcherServlet' i delegować określone zadania za pośrednictwem' ContextLoaderListener' tylko tam, gdzie potrzebujesz kontekstu. –

+0

Dlaczego to jest zły pomysł? Wiosenny framework sam przychodzi z tym słuchaczem i zaleca, aby go użyć do jego załadowania. 'DispatcherServlet' jest dla mvc, a mvc to mniej niż 10% samej struktury, co jeśli nie chcę używać mvc? – Elbek

2

ContextLoaderListener jest rodzajem inicjującego założyć sprężyny WebApplicationContext podczas ApplicationListener jest bardziej na samym poziomie aplikacji java zamiast w kontekście aplikacji internetowych.

ContextLoaderListener to świetne i standardowe narzędzie do kontekstualizacji aplikacji, jeśli ma wiele różnych filtrów serwletów/servletów mapowanych do różnych usług. Zasadniczo warto mieć słuchaczy dla różnych serwletów takich aplikacji, aby można było uzyskać drobną kontekstualizację.

Nie znam charakteru aplikacji, którą budujesz, ale zakładam, że na razie próbujesz czegoś podstawowego. W takim przypadku, nawet w przypadku bardziej złożonej konfiguracji, lepiej jest załadować na starcie kontroler, który zajmuje się głównymi procedurami inicjalizacyjnymi, w tym kontekstualizacją. Można użyć fasoli kontroler masz z czymś takim w swoim web.xml:

<servlet> 
    <servlet-name>your-servlet</servlet-name> 
    <servlet-class> 
     org.springframework.web.servlet.DispatcherServlet 
    </servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

Ten servelt można również odwzorowane i wywołany, kiedy czytasz pewien wzorzec url Np

@RequestMapping("/welcome")   
    public ModelAndView helloWorld() 

I w deskryptorze wdrażania WWW, ten bit jest jak mapować serwletów do innych usług jak Wiosna Wiosna Bezpieczeństwo:

<servlet-mapping> 
    <servlet-name>crunchify</servlet-name> 
    <url-pattern>*.html</url-pattern> 
</servlet-mapping> 

Tak naprawdę nie trzeba używać konstruktora kontroler i nie zawsze musisz używać ContextLoaderListener lub innych detektorów do prostych zadań inicjujących. Niemniej jednak, przydaje się, aby poznać ich przypadki użycia, ponieważ będą one potrzebne podczas skalowania aplikacji.

Więcej o dyspozytora serwletu tutaj:

http://static.springsource.org/spring/docs/3.2.x/javadoc-api/org/springframework/web/servlet/DispatcherServlet.html

+0

co jeśli nie chce używać mvc, ale chce załadować sprężynę? – Elbek

+0

Mówi, że zrobił kontroler i prawdopodobnie już idzie drogą mvc. Zobacz więcej szczegółów na ten temat tutaj [link] (http://syntx.co/languages-frameworks/difference-between-loading-context-via-dispatcherservlet-and-contextloaderlistener/): "Najlepszą praktyką jest zachowaj wyraźną separację między usługami warstwy pośredniej, takimi jak komponenty logiki biznesowej i klasy dostępu do danych (które są zazwyczaj zdefiniowane w kontekście aplikacji) i komponenty związane z WWW, takie jak kontrolery i interpretatory widoku (zdefiniowane w WebApplicationContext na serwlet Dispatchera). " –