Mam przypadek użycia, w którym muszę wywołać metodę (niestatyczną) w komponencie bean tylko raz podczas ładowania ApplicationContext. Czy to w porządku, jeśli użyję do tego MethodInvokingFactoryBean? Czy mamy jakieś lepsze rozwiązanie?
Na marginesie, używam ConfigContextLoaderListener, aby załadować kontekst aplikacji w aplikacji internetowej. I chcę, aby jeśli utworzono instancję komponentu bean „A”, wystarczy wywołać metodęA () raz.
Jak można to zrobić ładnie?
Aby rozwinąć sugestię @PostConstruct w innych odpowiedziach, moim zdaniem jest to naprawdę najlepsze rozwiązanie.
źródło
<context:component-scan>
również działa i może być przydatny w celu skrócenia czasu uruchamiania, jeśli masz duże biblioteki inne niż Spring na ścieżce klasy.Istnieją trzy różne podejścia do rozważenia, jak opisano w odnośniku
Użyj atrybutu metody init
Plusy:
Cons:
Wdrożenie InitializingBean
Plusy:
Cons:
Użyj adnotacji JSR-250 @PostConstruct Lifecyle
Plusy:
Cons:
źródło
@PostConstruct
właśnie dlatego, że należy do klasy, która potrzebuje wywołania metody na końcu przetwarzania inicjalizacji.Czy próbowałeś wdrożyć
InitializingBean
? Brzmi jak dokładnie to, czego szukasz.Minusem jest to, że twoja fasola staje się świadoma wiosny, ale w większości aplikacji nie jest tak źle.
źródło
Aby to zrobić, możesz wdrożyć niestandardowy procesor BeanPost w kontekście aplikacji. Lub jeśli nie masz nic przeciwko zaimplementowaniu interfejsu Spring w fasoli, możesz użyć interfejsu InitializingBean lub dyrektywy „init-method” (ten sam link).
źródło
Aby jeszcze bardziej usunąć wszelkie nieporozumienia dotyczące dwóch metod, tj. Zastosowania
@PostConstruct
iinit-method="init"
Z własnego doświadczenia zdałem sobie sprawę, że użycie (1) działa tylko w kontenerze serwletu, podczas gdy (2) działa w dowolnym środowisku, nawet w aplikacjach komputerowych. Tak więc, jeśli używasz Springa w samodzielnej aplikacji, musisz użyć (2), aby wykonać to wywołanie tej metody po inicjalizacji.
źródło
@PostConstruct
(w przypadku korzystania z aplikacji Spring) jest powiązany z długością życia kontekstu Springa. Takie konteksty mogą być używane we wszelkiego rodzaju aplikacjach.