Как настроить init-метод для bean, когда spring настроен с помощью аннотации?
Я использую spring roo для создания проекта, и он управляется аннотациями, и в XML-файле нет определения bean. Все настройки в *.файл дя.
и теперь я хочу настроить метод init для компонента, у которого нет конструктора по умолчанию (этот компонент от третьей стороны, и у него есть конструктор с аргументами, и я не могу удалить их или дать ему конструктор по умолчанию.)
кто-нибудь может сказать мне, как это делать, пожалуйста.
причина, по которой я хочу это сделать, заключается в том, что я хочу использовать applicationContext.getBean("thatBeanName")
динамически получить bean и использовать его. Поскольку у компонента нет конструктора по умолчанию, я всегда получаю ошибку:java.lang.NoSuchMethodException: com.to.that.bean.<init>()
и именно поэтому я хочу добавить init-метод в bean.
5 ответов
использовать @PostConstruct
как показано в примере ниже. Это эквивалентно init-method="initialize()"
@PostConstruct
public void initialize() {
messages.put("English", "Welcome");
messages.put("Deutsch", "Willkommen");
}
в весеннем контейнере это метод" init", который называется последним,
@postconstruct вызывается перед afterPropertiesSet. поэтому безопаснее, если кто-то пропустит использование.
"Несколько механизмов жизненного цикла, настроенных для одного и того же компонента, с различными методами инициализации, называются следующим образом:
1.Методы с аннотацией @PostConstruct
2.afterPropertiesSet (), как определено интерфейсом обратного вызова InitializingBean
- пользовательский настроенный метод init() [https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-java-lifecycle-callbacks][1]
хотя, сегодня я бы предпочел быть более независимым от Spring и использовать @Postconstract или даже настроить распознавание метода init по умолчанию. чтобы иметь только значимое имя метода, укажите, что он должен использоваться для инициализации-очистить от фреймворков, очистить от комментарии.
Как сказал @Pangea,@PostConstruct самый лучший выбор. Вы также можете реализовать initializingBean и выполнить инициализацию в методе afterPropertiesSet .Проверка здесь для этого подхода.
я понял, что было несколько ответов, пытающихся решить проблему. Но с нов ввел @Configuration
, который широко используется внутри Весна Загрузки. Все немного изменилось.
если вы используете @Bean
аннотации @Configuration
аннотированный класс, например:
@Configuration
class FooClass {
@Bean
public Bar bar() {
return new Bar();
}
}
если вы хотите использовать автоматически вызываемый метод на экземпляре bean во время инициализации, у вас есть два варианта ниже:
Option1:
@Configuration
class FooClass {
@Bean(initMethod="init")
public Bar bar() {
return new Bar();
}
}
Option2:
@Configuration
class FooClass {
@Bean
public Bar bar() {
Bar bar = new Bar();
bar.init();
return bar;
}
}
но, как объясняется в @Bean
Java Doc здесь:
/** * The optional name of a method to call on the bean instance during initialization. * Not commonly used, given that the method may be called programmatically directly * within the body of a Bean-annotated method. * The default value is {@code ""}, indicating no init method to be called. */
второй рассматривается как лучший ответ. Ссылка здесь