Как настроить init-метод для bean, когда spring настроен с помощью аннотации?

Я использую spring roo для создания проекта и его аннотации, и в XML файле нет определения bean. Вся информация о конфигурации находится в файле *.aj.

И теперь я хочу настроить метод init для bean, у которого нет конструктора по умолчанию (что bean принадлежит третьей стороне и имеет конструктор с аргументами, и я не могу удалить их или дайте ему конструктор по умолчанию.)

Есть ли кто-нибудь, кто может сказать мне, как это сделать, пожалуйста?

Причина, по которой я хочу это сделать, заключается в том, что я хочу использовать applicationContext.getBean("thatBeanName") для динамического получения bean и использования. Поскольку bean не имеет конструктора по умолчанию, я всегда получаю ошибку: java.lang.NoSuchMethodException: com.to.that.bean.<init>(), поэтому я хочу добавить init-метод к bean.

Ответ 1

Используйте @PostConstruct, как показано ниже. Это эквивалентно init-method="initialize()"

@PostConstruct
public void initialize() {
    messages.put("English", "Welcome");
    messages.put("Deutsch", "Willkommen");
}

Ответ 2

@Bean(initMethod="init")
public void MyBean getMyBean() {
 ...
}

Ответ 3

Как добавил @Pangea, лучший выбор - @PostConstruct. Вы также можете реализовать initializingBean и выполнить инициализацию в методе afterPropertiesSet.Проверьте здесь для этого подхода.

Ответ 4

В контейнере spring это метод init, который называется последним,
@postconstruct, вызываемый до afterPropertiesSet. так что это безопаснее, если кто-то пропустит использование. "Несколько механизмов жизненного цикла, настроенных для одного и того же bean, с различными методами инициализации, называются следующим образом:

1. Методы, аннотированные с помощью @PostConstruct

2.afterPropertiesSet(), как определено интерфейсом обратного вызова InitializingBean

  1. Пользовательский настроенный метод init() [https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-java-lifecycle-callbacks][1]

Хотя, сегодня я бы предпочел быть более независимым spring и использовать либо @Postconstract, либо даже настроить распознавание метода init по умолчанию. иметь только содержательное имя метода, указывать, что оно должно использоваться для инициализации - очистить от фреймворков, очистить от аннотаций.

Ответ 5

Я понял, что было несколько ответов, пытающихся решить проблему. Но с недавно введенным @Configuration, который широко используется в Spring Boot. Вещи немного изменены.

Если вы используете аннотацию @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.

     */

Второй считается лучшим ответом. См. Ссылку здесь