Czy jest jakaś funkcja Spring 3 do wykonywania niektórych metod przy pierwszym uruchomieniu aplikacji? Wiem, że mogę załatwić sztuczkę polegającą na ustawianiu metody z @Scheduled
adnotacją i jest ona wykonywana zaraz po uruchomieniu, ale wtedy będzie wykonywana okresowo.
176
Odpowiedzi:
Jeśli przez „uruchamianie aplikacji” masz na myśli „uruchamianie kontekstu aplikacji”, to tak, jest na to wiele sposobów , najłatwiejszym (w każdym razie w przypadku pojedynczych fasoli) jest dodanie adnotacji do metody
@PostConstruct
. Spójrz na link, aby zobaczyć inne opcje, ale podsumowując, są to:@PostConstruct
afterPropertiesSet()
zgodnie z definicją wInitializingBean
interfejsie wywołań zwrotnychTechnicznie rzecz biorąc, są to haczyki do cyklu życia fasoli , a nie do cyklu życia kontekstu, ale w 99% przypadków oba są równoważne.
Jeśli chcesz podłączyć się konkretnie do uruchamiania / zamykania kontekstu, możesz zamiast tego zaimplementować
Lifecycle
interfejs , ale prawdopodobnie jest to niepotrzebne.źródło
Access restriction: The type PostConstruct is not accessible due to restriction on required library /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/jre/lib/rt.jar
@PostConstruct
nazwano jej metodę, ale infrastruktura JMS, od której pośrednio zależała, nie była jeszcze w pełni okablowana (a będąc Springem wszystko po cichu zawiodło). Po przełączeniu na@EventListener(ApplicationReadyEvent.class)
wszystko działało (ApplicationReadyEvent
czy Spring Boot jest specyficzny dla wanilii Spring zobacz odpowiedź Stefana).Można to łatwo zrobić za pomocą pliku
ApplicationListener
. Mam to do pracy, słuchając SpringaContextRefreshedEvent
:Odbiorniki aplikacji działają synchronicznie wiosną. Jeśli chcesz mieć pewność, że kod zostanie wykonany tylko raz, po prostu zachowaj jakiś stan w swoim komponencie.
AKTUALIZACJA
Począwszy od Spring 4.2+ możesz również użyć
@EventListener
adnotacji, aby obserwowaćContextRefreshedEvent
(dzięki @bphilipnyc za wskazanie tego):źródło
ContextStartedEvent
zamiast tego, trudniej jest dodać słuchacza przed uruchomieniem zdarzenia.Wiosną 4.2+ możesz teraz po prostu:
źródło
Jeśli używasz butów sprężynowych, to jest najlepsza odpowiedź.
Czuję, że
@PostConstruct
i inne różne wtrącenia związane z cyklem życia są okrężne. Mogą one bezpośrednio prowadzić do problemów w czasie wykonywania lub powodować mniej niż oczywiste defekty z powodu nieoczekiwanych zdarzeń związanych z cyklem życia komponentu bean / kontekst. Dlaczego po prostu nie wywołać bezpośrednio swojego beana przy użyciu zwykłej Javy? Nadal wywołujesz fasolę w „wiosenny sposób” (np. Przez sprężynowe proxy AoP). A co najważniejsze, to zwykła java, nie może być prostsza. Nie ma potrzeby słuchania kontekstu ani nieparzystych harmonogramów.źródło
main()
wcale, na przykład podczas korzystania z frameworka aplikacji (np. JavaServer Faces).Dla użytkowników Javy 1.8, którzy otrzymują ostrzeżenie podczas próby odniesienia się do adnotacji @PostConstruct, zamiast tego skończyłem na piggybackingu z adnotacją @Scheduled, co możesz zrobić, jeśli masz już zadanie @Scheduled z fixedRate lub fixedDelay.
źródło
To, co zrobiliśmy, to rozszerzenie
org.springframework.web.context.ContextLoaderListener
możliwości drukowania czegoś, gdy kontekst się zaczyna.Skonfiguruj podklasę, a następnie w
web.xml
:źródło
Dzięki SpringBoot możemy wykonać metodę przy starcie za pomocą
@EventListener
adnotacjiźródło
Możesz także użyć metody zaplanowanej z bardzo wysokim ustawieniem fixedDelay
Ma to tę zaletę, że cała aplikacja jest okablowana (Transakcje, Dao, ...)
widoczne w sekcji Planowanie zadań do jednorazowego uruchomienia przy użyciu przestrzeni nazw zadań Spring
źródło
@PostConstruct
?Opublikował inne rozwiązanie, które implementuje WebApplicationInitializer i jest wywoływane na długo przed utworzeniem instancji dowolnego elementu spring bean, na wypadek gdyby ktoś miał taki przypadek użycia
Zainicjuj domyślne ustawienia regionalne i strefę czasową z konfiguracją Spring
źródło
źródło
Jeśli chcesz skonfigurować komponent bean przed pełnym uruchomieniem aplikacji, możesz użyć
@Autowired
:źródło
Możesz użyć
@EventListener
swojego komponentu, który zostanie wywołany po uruchomieniu serwera i zainicjowaniu wszystkich komponentów bean.źródło
Dla pliku
StartupHousekeeper.java
znajduje się w opakowaniucom.app.startup
,Zrób to w
StartupHousekeeper.java
:I zrób to w
myDispatcher-servlet.java
:źródło