Выполнить метод при запуске Spring

я хочу выполнить некоторый код во время (или, скорее, в конце) запуска приложения. Я нашел пару ресурсов, делающих это с помощью аннотации @PostConstruct, @EventListener(ContextRefreshedEvent.class), реализации InitializingBean, реализации ApplicationListener... Все они выполняют мой код при запуске, но заполнитель свойств приложения при этом не заменяется момент. Поэтому, если в моем классе есть член с аннотацией @Value("${my.property}"), он возвращает "${my.property}" вместо фактического значения, определенного в yaml (или где-либо еще). Как мне выполнить мой код после замены?


person Stefan Fuchs    schedule 23.09.2017    source источник
comment
Spring конфигурации будут разрешать заполнители свойств, размещенные внутри @Value. если он не загружается, это означает либо неправильное имя свойства, либо конкретный yaml не загружается в контекст. Конечно, вы можете использовать @PostConstuct для установки члена   -  person Barath    schedule 23.09.2017


Ответы (5)


Вы можете реализовать InitializingBean, у которого есть метод с именем afterPropertiesSet(). Этот метод будет вызываться после замены всех заполнителей свойств.

person zuckermanori    schedule 23.09.2017

@PostConstruct вызывается при создании bean-компонента. Ypu должен проверить, нашел ли Spring файл со свойствами.

person matifac    schedule 23.09.2017

Если у вас есть класс конфигурации @Configuration, вы можете попробовать явно импортировать файл свойств, добавив следующую аннотацию:

@PropertySource("classpath:your-properties-file.properties")

Любые другие ресурсы, не относящиеся к конфигурации, должны загружаться после ваших классов конфигурации, и ваши аннотации @Value должны работать нормально.

person Max Bilbow    schedule 23.09.2017

Вы должны реализовать ApplicationListener<ContextRefreshedEvent> следующим образом:

@Component
public class SpringContextListener implements ApplicationListener<ContextRefreshedEvent> {

        @Value("${my.property}")
        private String someVal;

        /**
         * // This logic will be executed after the application has loded
         */
        public void onApplicationEvent(ContextRefreshedEvent event) {
            // Some logic here
        }
    }
person mad_fox    schedule 24.09.2017

Вы можете получить его после начала весенней загрузки.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.core.annotation.Order;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Component;

@Component
@Order(0)
class ApplicationReadyInitializer implements ApplicationListener<ApplicationReadyEvent> {

    @Autowired
    ResourceLoader resourceLoader;

    @Value("${my.property}")
    private String someVal;

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        // App was started. Do something
    }

}
person Rafael S. Fijalkowski    schedule 25.02.2020