Ответ 1
Используйте @PostConstruct
, как показано ниже. Это эквивалентно init-method="initialize()"
@PostConstruct
public void initialize() {
messages.put("English", "Welcome");
messages.put("Deutsch", "Willkommen");
}
Я использую spring roo для создания проекта и его аннотации, и в XML файле нет определения bean. Вся информация о конфигурации находится в файле *.aj.
И теперь я хочу настроить метод init для bean, у которого нет конструктора по умолчанию (что bean принадлежит третьей стороне и имеет конструктор с аргументами, и я не могу удалить их или дайте ему конструктор по умолчанию.)
Есть ли кто-нибудь, кто может сказать мне, как это сделать, пожалуйста?
Причина, по которой я хочу это сделать, заключается в том, что я хочу использовать applicationContext.getBean("thatBeanName")
для динамического получения bean и использования. Поскольку bean не имеет конструктора по умолчанию, я всегда получаю ошибку: java.lang.NoSuchMethodException: com.to.that.bean.<init>()
, поэтому я хочу добавить init-метод к bean.
Используйте @PostConstruct
, как показано ниже. Это эквивалентно init-method="initialize()"
@PostConstruct
public void initialize() {
messages.put("English", "Welcome");
messages.put("Deutsch", "Willkommen");
}
@Bean(initMethod="init")
public void MyBean getMyBean() {
...
}
Как добавил @Pangea, лучший выбор - @PostConstruct. Вы также можете реализовать initializingBean и выполнить инициализацию в методе afterPropertiesSet.Проверьте здесь для этого подхода.
В контейнере spring это метод init, который называется последним,
@postconstruct, вызываемый до afterPropertiesSet. так что это безопаснее, если кто-то пропустит использование.
"Несколько механизмов жизненного цикла, настроенных для одного и того же bean, с различными методами инициализации, называются следующим образом:
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 по умолчанию. иметь только содержательное имя метода, указывать, что оно должно использоваться для инициализации - очистить от фреймворков, очистить от аннотаций.
Я понял, что было несколько ответов, пытающихся решить проблему. Но с недавно введенным @Configuration
, который широко используется в Spring Boot. Вещи немного изменены.
Если вы используете аннотацию @Bean
в @Configuration
аннотированном классе, например:
@Configuration
class FooClass {
@Bean
public Bar bar() {
return new Bar();
}
}
Если вы хотите использовать автоматически вызываемый метод в экземпляре bean во время инициализации, у вас есть два варианта ниже:
@Configuration
class FooClass {
@Bean(initMethod="init")
public Bar bar() {
return new Bar();
}
}
@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. */
Второй считается лучшим ответом. См. Ссылку здесь