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