在bean构造中使用Spring @Value

时间:2013-05-30 19:42:48

标签: java spring properties

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

问题是当我尝试在构建其他spring bean时使用这些属性,就像在我的hibernate配置中一样。在我的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注释为我工作,或者我是否必须使用其他东西?

如果我必须使用别的东西,有没有人有任何建议?

2 个答案:

答案 0 :(得分: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;
    } 
}

答案 1 :(得分:2)

我认为这类似于@PropertySource注释所面临的问题,其中@Value未注入@Configuration POJO。我发现有两种解决方法:

1)创建一个Spring XML配置(如果你还没有),你将使用@Configuration@ImportResource课程中引用它,并在其中有一个条目:{{ 1}}。该配置应该使<context:property-placeholder />类上的@Value注入工作。

2)不要在@Configuration POJO中使用@Value,而是注入@Configuration并从那里检索道具:

Environment