Как вызвать метод после завершения инициализации bean?
У меня есть прецедент, когда мне нужно вызвать (нестатический) метод в bean только один раз при загрузке ApplicationContext. Это нормально, если я использую MethodInvokingFactoryBean для этого? Или у нас есть лучшее решение?
в качестве примечания я использую ConfigContextLoaderListener для загрузки контекста приложения в веб-приложении. И хочу, чтобы если bean ' A ' создается, просто вызовите methodA () один раз.
Как это можно сделать красиво?
6 ответов
вы можете использовать что-то вроде:
<beans>
<bean id="myBean" class="..." init-method="init"/>
</beans>
это вызовет метод "init"при создании экземпляра компонента.
чтобы расширить предложение @PostConstruct в других ответах, это действительно лучшее решение, на мой взгляд.
- он держит ваш код отделенным от Spring API (@PostConstruct находится в javax.*)
- он явно аннотирует ваш метод init как то, что нужно вызвать для инициализации bean
- вам не нужно помнить, чтобы добавить атрибут init-method в определение spring bean, spring автоматически вызовет метод (предполагая, что вы зарегистрируете опцию annotation-config где-то еще в контексте, в любом случае).
существует три различных подхода для рассмотрения, как описано в ссылка
использовать атрибут init-method
плюсы:
- не требует, чтобы bean реализовывал интерфейс.
плюсы:
- нет немедленного указания этот метод требуется после построения, чтобы убедиться, что компонент правильно настроен.
выполнить InitializingBean
плюсы:
- нет необходимости указывать init-метод или включать сканирование компонентов / обработку аннотаций.
- подходит для компонентов, поставляемых с библиотекой, где мы не хотим, чтобы приложение, использующее эту библиотеку, занималось жизненным циклом компонентов.
плюсы:
- более инвазивный, чем подход init-метода.
использовать JSR-250 @PostConstruct жизненный цикл аннотация
плюсы:
- полезно при использовании сканирования компонентов для автоопределения бобов.
- дает понять, что для инициализации должен использоваться определенный метод. Намерение ближе к коду.
плюсы:
- инициализация больше не задается централизованно в конфигурации.
- вы должны помнить, чтобы включить обработку аннотаций (которые иногда могут быть забыты)
вы пробовали реализации InitializingBean
? Похоже, это именно то, что вам нужно.
недостатком является то, что ваш боб становится пружинным, но в большинстве приложений это не так плохо.
вы можете развернуть пользовательский BeanPostProcessor в контексте вашего приложения, чтобы сделать это. Или, если вы не возражаете против реализации интерфейса Spring в вашем bean, вы можете использовать InitializingBean интерфейс или директива "init-method" (та же ссылка).
для дальнейшего прояснения любой путаницы в отношении двух подходов i.e использование
-
@PostConstruct
и init-method="init"
из личного опыта я понял, что использование (1) работает только в контейнере сервлетов, в то время как (2) работает в любой среде, даже в настольных приложениях. Таким образом, если вы будете использовать Spring в автономном приложении, вам придется использовать (2) для выполнения этого "вызова этого метода после инициализации.