Как вызвать метод после завершения инициализации 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 использование

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

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