Весенняя конфигурация на основе 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 12

1 ответ:

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

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

Пожалуйста, смотрите раздел "Bootstrapping"@Bean javadoc для получения дополнительной информации.