Весенняя конфигурация на основе Java со статическим методом
Может кто-нибудь посоветовать, почему нам нужно объявить Боб PropertySourcesPlaceholderConfigurer, используя статический метод ? Я просто обнаружил, что если я использую нестатический Для ниже, то url будет установлен в нулевое значение вместо того, чтобы брать из файла свойств -
@Value("${spring.datasource.url}")
private String url;
@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfig(String profile) {
String propertyFileName = "application_"+profile+".properties";
System.out.println(propertyFileName);
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
configurer.setLocation(new ClassPathResource(propertyFileName));
return configurer;
}
@Bean
@Profile("local")
public static String localProfile(){
return "local";
}
@Bean
@Profile("prod")
public static String prodProfile(){
return "prod";
}
1 ответ:
PropertySourcesPlaceholderConfigurer
объекты ответственны за разрешение аннотаций@Value
относительно текущей среды Spring и ее набора PropertySources.PropertySourcesPlaceholderConfigurer
класс реализуетBeanFactoryPostProcessor
. В жизненном цикле контейнера объектBeanFactoryPostProcessor
должен быть создан раньше, чем объект класса@Configuration
с аннотациями.Если у вас есть
@Configuration
-аннотированный класс с методом экземпляра, возвращающим ОбъектPropertySourcesPlaceholderConfigurer
, то контейнер не может создать экземпляр объектаPropertySourcesPlaceholderConfigurer
без создания самого объекта класса@Configuration
-аннотированного. В этом случае@Value
не может быть разрешен, так как ОбъектPropertySourcesPlaceholderConfigurer
не существует в момент создания экземпляра Объекта@Configuration
-аннотированного класса. Таким образом,@Value
-аннотированное поле принимает значение по умолчанию, которое равноnull
.Пожалуйста, смотрите раздел "Bootstrapping"
@Bean
javadoc для получения дополнительной информации.