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