如何使用 Environment 对象在 Spring 中使用 .properties 文件



我对春季外部属性的工作原理有以下疑问。

例如,考虑以下 Bean 定义(进入 Java 配置类):

@Bean
public DataSource dataSource() {
    DataSource ds = new BasicDataSource();
    ds.setDriverClassName("org.postgresql.Driver");
    ds.setUrl("jdbc:postgresql://localhost/transfer" );
    ds.setUser("transfer-app");
    ds.setPassword("secret45" );
    return ds;
}

好的,如您所见,连接参数是硬编码的,这不好,所以我可以将它们外部化到属性文件中

阅读文档后,我发现我还可以使用 Environment 对象从运行时环境中获取属性,例如:

  • JVM 系统属性
  • Java 属性文件
  • Servlet 上下文参数
  • 系统环境变量
  • 金迪

因此,在我看来,我可以使用此环境对象从我的属性文件中获取信息,而不必担心访问它的过程。对吗?

因此,例如,如果我将以下 Bean 配置放入 Java 配置类中:

@Configuration
public class ApplicationConfig {
    @Autowired public Environment env;
    @Bean public DataSource dataSource() {
        DataSource ds = new BasicDataSource();
        ds.setDriverClassName( env.getProperty( "db.driver" ));
        ds.setUrl( env.getProperty( "db.url" ));
        ds.setUser( env.getProperty( "db.user" ));
        ds.setPassword( env.getProperty( "db.password" ));
        return ds;
     }
}

这意味着我使用 @Autowired 获取环境对象(Spring 为我搜索匹配的对象),然后我使用此对象访问名为 db.properties 的属性文件,该文件已放入代码中的某个位置。

对吗?

现在我的疑问是:

1) 在我的项目中存在我的 .properties 文件的标准位置,或者我可以将它们放在任何位置吗?

2)在前面的代码片段中,我没有指定特定的.properties文件。环境对象如何工作?它会自动加载我项目中的所有 .properties 文件?

你应该添加@PropertySource注释:

@Configuration
@PropertySource({"classpath:/com/your/path/app.properties"})
public class ApplicationConfig {
    @Autowired 
    public Environment env;
    @Bean public DataSource dataSource() {
        DataSource ds = new BasicDataSource();
        ds.setDriverClassName( env.getProperty( "db.driver" ));
        ds.setUrl( env.getProperty( "db.url" ));
        ds.setUser( env.getProperty( "db.user" ));
        ds.setPassword( env.getProperty( "db.password" ));
        return ds;
     }
}

我建议阅读这个Spring JavaDoc http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/PropertySource.html

@PropertySources({
 @PropertySource("file:/absolutepath/app.properties"),//IF you want to load from file system using absolute path 
 @PropertySource("classpath:app.properties"),   //IF you want to load from classpath
 @PropertySource("file:{environment_Variable}/app.properties"),   //IF you want to load using envirment varibale 
})

最新更新