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

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

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

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

Ответ 1

Вы можете использовать что-то вроде:

<beans>
    <bean id="myBean" class="..." init-method="init"/>
</beans>

Это вызовет метод "init" при создании bean.

Ответ 2

Чтобы расширить предложение @PostConstruct в других ответах, это действительно лучшее решение, на мой взгляд.

  • Он сохраняет ваш код развязанным из API Spring (@PostConstruct в javax. *)
  • Он явно аннотирует ваш метод init как что-то, что нужно вызвать для инициализации bean
  • Вам не нужно забывать добавлять атрибут init-method в определение Spring bean, Spring будет автоматически вызывать метод (если вы зарегистрируете параметр аннотации-config где-то еще в контексте, в любом случае).

Ответ 3

Существует три разных подхода к рассмотрению, как описано в reference

Использовать атрибут init-method

Плюсы:

  • Не требуется bean для реализации интерфейса.

Минусы:

  • Нет немедленного указания, что этот метод необходим после построения, чтобы обеспечить правильную настройку bean.

Реализация InitializingBean

Плюсы:

  • Не нужно указывать метод init или включать обработку сканирования/аннотации компонентов.
  • Подходит для beans, поставляемого с библиотекой, где мы не хотим, чтобы приложение, использующее эту библиотеку, занималось жизненным циклом bean.

Минусы:

  • Более инвазивный, чем метод init-метода.

Использовать JSR-250 @PostConstruct аннотация для lifecyle

Плюсы:

  • Полезно при использовании сканирования компонентов для автоматического определения beans.
  • Указывает, что для инициализации должен использоваться конкретный метод. Намерение ближе к коду.

Минусы:

  • Инициализация уже не сконфигурирована централизованно.
  • Не забудьте включить обработку аннотаций (которую иногда можно забыть)

Ответ 4

Вы пытались реализовать InitializingBean? Это похоже на то, что вам нужно.

Недостатком является то, что ваш bean становится Spring -aware, но в большинстве приложений это не так уж плохо.

Ответ 5

Вы можете развернуть в своем приложении контекст InitializingBean или" init -метод "(та же ссылка).

Ответ 6

Чтобы еще больше устранить путаницу в отношении двух подходов, используя

  • @PostConstruct и
  • init-method="init"

Из личного опыта я понял, что использование (1) работает только в контейнере сервлетов, а (2) работает в любой среде, даже в настольных приложениях. Итак, если вы используете Spring в автономном приложении, вам придется использовать (2) для выполнения этого "вызывать этот метод после инициализации".