Весенняя конфигурация на основе 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"
@Beanjavadoc для получения дополнительной информации.