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

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

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

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

Ответы на вопрос(6)

на мой взгляд, это действительно лучшее решение.

Он сохраняет ваш код отделенным от Spring API (@PostConstruct находится в javax. *) Он явно аннотирует ваш метод init как то, что нужно вызвать для инициализации bean-компонента Вам не нужно помнить, чтобы добавить атрибут init-method к определению вашего bean-компонента Spring, spring автоматически вызовет метод (в любом случае, если вы зарегистрируете опцию annotation-config где-нибудь еще в контексте).
 John Rix24 февр. 2015 г., 23:10
@ PostConstruct также не очень пригодится вам, когда создаваемый вами компонент - это не ваш собственный класс, а какой-то сторонний класс
 AHungerArtist11 мар. 2011 г., 18:16
Не знал о @PostConstruct, пока не прочитал этот пост. Выручил меня, так что спасибо.
 Andrew Swan26 февр. 2014 г., 22:57
JavaDoc для PostConstruct говорит, что только один метод может быть аннотирован с ним на класс: Docs.oracle.com / JavaEE / 5 / API / javax / аннотаций / ...
 Donal Fellows26 мая 2011 г., 10:14
Подходящий<context:component-scan> также работает и может быть полезен для сокращения времени запуска, если в вашем пути к классам есть большие библиотеки, отличные от Spring.
 khylo14 мар. 2011 г., 18:02
Спасибо, это работает. Обратите внимание: если вы хотите использовать Spring, вы должны включить «<context: annotation-config />» для регистрации bean-компонента CommonAnnotationBeanPostProcessor (как упоминалось выше)
Решение Вопроса

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

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

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

 KJEjava4804 нояб. 2016 г., 08:07
@ Mercer Traieste что я должен дать для атрибута класса здесь? Могу ли я дать класс контроллера здесь?
 lwpro209 мая 2013 г., 10:10
postConstruct должен быть лучше в большинстве случаев, так как мы не хотим путаться с инициализацией bean-компонент
 Gondy08 июл. 2013 г., 09:46
Спасибо, я действительно искал что-то вроде новичка в Spring.
 Yngve Sneen Lindal07 окт. 2014 г., 17:17
@ lwpro2 Что вы подразумеваете под «не хотите портить весенние бины» здесь?

InitializingBean? Это звучит как то, что вы после.

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

 Oliver Drotbohm07 июл. 2009 г., 19:57
Это дело вкуса. Интерфейс является частью модели компонентов Spring и служит этой и только этой цели, в то время как для пользовательского именованного метода может быть не совсем очевидно, что его нужно вызывать для завершения жизненного цикла компонента. Так что это служит общению в основном. Конечно, с недостатком введенной зависимости от среды Spring. Хорошим способом между ними является использование @PostConstruct, так как он имеет четкую семантику, но не вводит зависимости ...
 Jon Skeet07 июл. 2009 г., 20:19
Oliver дает мне несколько хороших оправданий, но на самом деле я просто забыл о init-методе :) Еще одна причина в том, что сам тип знает, что его нужно «завершить» после того, как все свойства были установлены - это не так. т в основном то, чтодолже быть в конфигурации.
 Mark06 июл. 2009 г., 23:00
Есть ли причина, по которой вы бы выбрали реализацию интерфейса вместо указания метода init в XML?

т. Е. Использования

@PostConstruct а такжinit-method="init"

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

 Ayorinde26 мая 2011 г., 10:37
Такое поведение я ожидал, но у меня не получилось.
 Donal Fellows26 мая 2011 г., 10:18
Технически,@PostConstruct (при использовании в приложении на основе Spring) связано с продолжительностью жизни собственного контекста Spring. Такие контексты могут использоваться во всех видах приложений.

BeanPostProcessor в контексте вашего приложения, чтобы сделать это. Или, если вы не возражаете против реализации интерфейса Spring в вашем бине, вы можете использовать InitializingBean interface или директива init-method (та же ссылка).

 Rob H06 июл. 2009 г., 21:17
Spring поставляется со многими примерами. Просто посмотрите на API JavaDoc для BeanPostProcessor, и вы найдете ссылки на многие реализующие классы. Тогда посмотрите на исходный код для них.
 peakit06 июл. 2009 г., 20:50
У кого-нибудь есть подробности о том, как написать BeanPostProcessor. Это звучит как раз то, что мне нужно. Ура

ссылк

Используйте атрибут init-методаPros: Не требует bean-компонента для реализации интерфейса.Cons: Нет немедленного указания, что этот метод необходим после построения, чтобы убедиться, что компонент настроен правильно.Implement InitializingBeanPros: Нет необходимости указывать init-метод или включать компонентное сканирование / обработку аннотаций. Подходит для bean-компонентов, поставляемых с библиотекой, где мы не хотим, чтобы приложение, использующее эту библиотеку, занималось жизненным циклом bean-компонента.Cons: Более инвазивен, чем метод init-метода. Используйте JSR-250@ PostConstruct аннотация жизненного циклаPros: Полезно при использовании компонентного сканирования для автоматического определения бинов. Дает понять, что для инициализации должен использоваться определенный метод. Намерение ближе к коду.Cons: Инициализация больше не указывается централизованно в конфигурации. Не забудьте включить обработку аннотаций (о которой иногда можно забыть)
 user48274522 июн. 2017 г., 12:56
Если этому классу ДЕЙСТВИТЕЛЬНО это нужно, и вы не можете сделать это в конструкторе, я считаю, что это запах кода.
 Donal Fellows26 мая 2011 г., 10:16
Я думаю, что на самом деле это хорошая вещь, чтобы использовать@PostConstruct именно потому, что он является частью класса, который нуждается в вызове метода в конце обработки инициализации.

Ваш ответ на вопрос