如何将Enviroment自动装配到PropertySourcesPlaceholderConfigurer中?

时间:2013-10-23 15:43:58

标签: java spring configuration

我正在尝试设置我的Spring应用程序,以便根据配置文件读取不同的.properties文件。我正在使用java配置,所以我想要做的是:

@Autowired
private static Environment env;

@Bean
public static PropertySourcesPlaceholderConfigurer properties(){
    PropertySourcesPlaceholderConfigurer pspc = new PropertySourcesPlaceholderConfigurer();
    String[] profiles = env.getActiveProfiles();
    String filestring = "environment."+profiles[0]+".properties";
    ClassPathResource properties = new ClassPathResource( filestring );
    Resource[] resources = new ClassPathResource[] { properties };
    pspc.setLocations( resources );
    return pspc;
}

然而env.getActiveProfiles()给了我一个NullPointerException,我认为这意味着没有注入环境。任何人都有任何想法如何解决这个问题?或者,如果这是愚蠢/不可能的,我怎么能更好地解决这个问题?

2 个答案:

答案 0 :(得分:0)

只是为您提供一个关于您的方法的替代视角(显然每个人的业务案例可能因项目而异),但您所追求的配置类型可能会导致其他问题。安心浮现在脑海中。通常,多个环境意味着您正在处理与数据库等各种连接的用户名和密码。根据您的其他配置存储生产环境的这些值可能会将敏感数据暴露给需要不了解此类事物的开发人员。相反,如果您使用SPeL表达式切换并直接引用环境,那么您仍然可以实现运行时配置,但将每个环境的设置移动到适用这些特定配置的服务器(或者你有什么)。例如:

<bean id="myDatabase" class="mypackage.MyDatabase" p:username="#{environment['DB_USERNAME']}" p:password="#{environment['DB_PASSWORD']}" .../>

然后在您的服务器上,您可以传入系统属性或使用您想要的用户名和密码设置环境变量,并在运行时配置它们。 (environment表达式直接解析为Environment实例。)

只是一个想法。 =)

答案 1 :(得分:0)

正如@ kungfuters正确建议的那样,商业案例可能因申请而异。这是另一个适用于我的应用程序的替代方案。

提供以下界面的实现:

ApplicationContextInitializer<ConfigurableApplicationContext>

提供以下方法的实现。识别配置文件的逻辑就在于这种方法。

initialize(ConfigurableApplicationContext ctx) 

根据标识,设置活动配置文件:

this.applicationContext.getEnvironment().setActiveProfiles(<<yourProfileName>>)