Как настроить init-метод для bean-компонента, если пружина настроена на основе аннотации? - PullRequest
14 голосов
/ 24 декабря 2011

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

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

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

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

Ответы [ 5 ]

23 голосов
/ 24 декабря 2011

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

@PostConstruct
public void initialize() {
    messages.put("English", "Welcome");
    messages.put("Deutsch", "Willkommen");
}
18 голосов
/ 03 мая 2016
@Bean(initMethod="init")
public MyBean getMyBean() {
 ...
}
4 голосов
/ 04 октября 2017

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

3 голосов
/ 24 декабря 2011

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

0 голосов
/ 19 октября 2017

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

Если вы используете аннотацию @Bean в @Configuration аннотированном классе, например:

@Configuration
class FooClass {
    @Bean
    public Bar bar() {
        return new Bar();
    }
}

Если вы хотите использовать автоматически вызываемый метод в бинеэкземпляр во время инициализации, у вас есть две опции ниже:

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.

     */

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

...