2

当我的 SpringApplicationContext 被一起提升时,我想从属性文件中获取一些值。根据我的阅读,最好为此使用PropertySourcesPlaceholderConfigurer。我在我的spring java配置中创建了那个bean,它正在正确解析属性。

问题是当我试图在我的其他 spring bean 的构造中使用这些属性时,比如在我的 hibernate 配置中。在我的休眠配置中,我有以下字段:

    @Value(value = "${myapp.database-access.url}")
    public static String DB_ACCESS_URL;

然后我使用该属性声明 url 以访问我的数据源 bean 中的数据库,如下所示:

    @Bean
    public DataSource dataSource() {

        BasicDataSource dataSource = new BasicDataSource();

        dataSource.setDriverClassName(DRIVER_CLASS_NAME);
        dataSource.setUrl(DATABASE_URL);
        dataSource.setUsername(DATABASE_USERNAME);
        dataSource.setPassword(DATABASE_PASSWORD);

        return dataSource;
    }

不幸的是,此时该值为 null,因此我的应用程序引导失败。施工后价值可用,但显然不是施工中期。在这种情况下,有没有办法让 @Value 注释为我工作,还是我必须使用其他东西?

如果我必须使用其他东西,有人有什么建议吗?

4

3 回答 3

3

Spring 不允许注入静态字段。

一种方法:

public class Config {

    public static String DB_ACCESS_URL;

    @Value(value = "${myapp.database-access.url}")
    public void setDbAccessUrl(String dbAccessUrl) {
        Config.DB_ACCESS_URL = dbAccessUrl;
    } 
}
于 2013-05-30T23:15:12.913 回答
2

我认为这类似于我在@PropertySource注释中遇到的问题,其中@Value 没有注入@ConfigurationPOJO。我发现有两种方法可以解决这个问题:

1) 创建一个 Spring XML 配置(如果您还没有),您将在@Configuration课堂上使用它来引用它,@ImportResource并在其中有一个条目:<context:property-placeholder />. 该配置应该@Value在类上进行注入@Configuration才能工作。

2)不要@Value@ConfigurationPOJO 中使用,而是Environment从那里注入和检索道具:

@Autowired Environment env;
//and further down at your dataSource bean retrieve the properties
//...
env.getProperty("myapp.database-access.url");
于 2013-05-30T20:19:51.993 回答
0

这已经很晚了,但是您可以简单地将@Value 与构造函数注入一起使用public DataSource dataSource(@Value(value = "${myapp.database-access.url}"))

于 2021-09-23T11:07:48.737 回答