Как вызвать метод после завершения инициализации компонента?
У меня есть случай использования, когда мне нужно вызвать (нестатический) метод в бобе только один раз при загрузке 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
? Похоже, это именно то, что вам нужно.недостатком является то, что ваш боб становится Spring-aware, но в большинстве приложений это не так уж плохо.
вы можете развернуть пользовательский BeanPostProcessor в контексте вашего приложения, чтобы сделать это. Или если вы не возражаете против реализации интерфейса Spring в своем Бобе, вы можете использовать InitializingBean интерфейс или директива "init-method" (та же ссылка).