Как настроить 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");
}

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

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

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 по умолчанию. чтобы иметь только значимое имя метода, укажите, что он должен использоваться для инициализации-очистить от фреймворков, очистить от комментарии.


Как сказал @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.

     */

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