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

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

4 ответа

Решение

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

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

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

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
    }

}

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

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

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

Вы должны реализовать 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
        }
    }
Другие вопросы по тегам