Spring Java 基于静态方法的配置

Spring Java based configuration with static method

任何人都可以告诉我们为什么我们需要使用 static 方法声明 PropertySourcesPlaceholderConfigurer bean 吗?我刚刚发现,如果我在下面使用非静态,那么 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";
}

PropertySourcesPlaceholderConfigurer 对象负责针对当前 Spring 环境及其 PropertySources 集解析 @Value 注释。 PropertySourcesPlaceholderConfigurer class 实施 BeanFactoryPostProcessor。在容器生命周期中,BeanFactoryPostProcessor 对象必须比 @Configuration-注解的 class 对象更早实例化。

如果您使用返回 PropertySourcesPlaceholderConfigurer 对象的实例方法对 @Configuration 注释 class,则容器无法在不实例化 [=] 的情况下实例化 PropertySourcesPlaceholderConfigurer 对象15=]-注释 class 对象本身。在这种情况下,无法解析 @Value,因为 PropertySourcesPlaceholderConfigurer 对象在 @Configuration 注释的 class 对象实例化时不存在。因此,@Value-注释字段采用默认值,即 null

有关详细信息,请参阅 @Bean javadoc 的 "Bootstrapping" 部分。