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

StackOverflow https://stackoverflow.com/questions/1088550

Вопрос

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

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

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

Это было полезно?

Решение

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

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

Это вызовет метод «init» при создании экземпляра компонента.

Другие советы

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

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

Существует три различных подхода, описанных в разделе ссылка

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

Плюсы:

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

Минусы:

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

Реализация инициализирующего компонента

Плюсы:

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

Минусы:

  • Более инвазивный, чем подход с использованием метода инициализации.

Используйте JSR-250 @PostConstruct аннотация жизненного цикла

Плюсы:

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

Минусы:

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

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

Обратной стороной является то, что ваш компонент становится поддерживающим Spring, но в большинстве приложений это не так уж и плохо.

Вы можете развернуть собственный БинПостпроцессор в контексте вашего приложения, чтобы сделать это.Или, если вы не против реализовать интерфейс Spring в своем компоненте, вы можете использовать ИнициализацияBean интерфейс или директиву «init-method» (та же ссылка).

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top