我对春季外部属性的工作原理有以下疑问。
例如,考虑以下 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
})