Подтвердить что ты не робот

Spring Java-конфигурация со статическим методом

может ли кто-нибудь обратиться к нам за советом, почему нам нужно объявить PropertySourcesPlaceholderConfigurer bean с помощью метода static? Я просто обнаружил, что если я использую нестатические для ниже, тогда url будет установлен в значение null вместо того, чтобы брать из файла свойств -

@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";
}
4b9b3361

Ответ 1

PropertySourcesPlaceholderConfigurer объекты несут ответственность за разрешение аннотаций @Value против текущей среды Spring и ее набора PropertySources. PropertySourcesPlaceholderConfigurer класс реализует BeanFactoryPostProcessor. В жизненном цикле контейнера объект BeanFactoryPostProcessor должен быть создан ранее, чем объект класса @Configuration -annotated.

Если у вас есть @Configuration -annotated класс с методом экземпляра, возвращающим объект PropertySourcesPlaceholderConfigurer, то контейнер не может создать экземпляр объекта PropertySourcesPlaceholderConfigurer без создания экземпляра объекта @Configuration -annotated class. В этом случае @Value не может быть разрешен, так как объект PropertySourcesPlaceholderConfigurer не существует в момент создания объекта класса @Configuration -annotated. Таким образом, поле @Value -annotated принимает значение по умолчанию, которое равно null.

Дополнительную информацию см. в разделе "Bootstrapping" @Bean javadoc.