Как вызвать метод после завершения инициализации компонента?


У меня есть случай использования, когда мне нужно вызвать (нестатический) метод в бобе только один раз при загрузке ApplicationContext. Это нормально, если я использую MethodInvokingFactoryBean для этого? Или у нас есть какое-то лучшее решение?

в качестве примечания я использую ConfigContextLoaderListener для загрузки контекста приложения в веб-приложении. И хочу, чтобы если bean 'A' инстанцируется просто вызвать methodA() один раз.

Как это можно сделать красиво?

6 211

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" (та же ссылка).

для дальнейшего прояснения любой путаницы в отношении двух подходов, т. е. использования

  1. @PostConstruct и
  2. init-method="init"