从非Spring托管bean中获取配置值

时间:2013-09-24 21:35:57

标签: java spring

我正在使用注释配置,而不是我的应用程序的XML ...

@Configuration
@ComponentScan(basePackages = {
        "com.production"
    })
@PropertySource(value= {
        "classpath:/application.properties",
        "classpath:/environment-${COMPANY_ENVIRONMENT}.properties"
})
@EnableJpaRepositories("com.production.repository")
@EnableTransactionManagement
@EnableScheduling
public class Config {
    @Value("${db.url}")
    String PROPERTY_DATABASE_URL;
    @Value("${db.user}")
    String PROPERTY_DATABASE_USER;
    @Value("${db.password}")
    String PROPERTY_DATABASE_PASSWORD;

    @Value("${persistenceUnit.default}")
    String PROPERTY_DEFAULT_PERSISTENCE_UNIT;

在这个文件中,我注意到我可以从@PropertySource文件中获取配置值。如何在spring托管bean之外获取这些值?

我是否可以使用我的ApplicationContextProvider来获取这些值?

public class ApplicationContextProvider implements ApplicationContextAware {
    private static ApplicationContext applicationContext;

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public void setApplicationContext (ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }
}

1 个答案:

答案 0 :(得分:4)

如果我理解正确,是的,您可以使用ApplicationContextProvider课程。 @PropertySource属性最终位于ApplicationContext Environment。因此,您可以像

一样访问它们
public static class ApplicationContextProvider implements ApplicationContextAware {
    private static ApplicationContext applicationContext;

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public void setApplicationContext (ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
        Environment env = applicationContext.getEnvironment();
        System.out.println(env.getProperty("db.user")); // access them 
    }
}

因此,基本上只要您引用ApplicationContext,您就可以获得@PropertySourcesPropertySourcesPlaceholderConfigurer中声明的属性。

但是,在这种情况下,ApplicationContextProvider必须在您的上下文中声明为Spring bean。

@Bean
public ApplicationContextProvider contextProvider() {
    return new ApplicationContextProvider();
}