java - propertysource - spring boot configuration properties
ConfiguraciĆ³n de propiedades de Spring mediante @PropertySource (1)
Si está utilizando (o está dispuesto a usar) Spring Boot, puede usar la anotación @ConfigurationProperties
.
Aquí hay un ejemplo del código fuente de Spring Boot:
@ConfigurationProperties(prefix = "spring.activemq")
public class ActiveMQProperties {
private String brokerUrl = "tcp://localhost:61616";
private boolean inMemory = true;
private boolean pooled = false;
private String user;
private String password;
// Will override brokerURL if inMemory is set to true
public String getBrokerUrl() {
if (this.inMemory) {
return "vm://localhost";
}
return this.brokerUrl;
}
public void setBrokerUrl(String brokerUrl) {
this.brokerUrl = brokerUrl;
}
public boolean isInMemory() {
return this.inMemory;
}
public void setInMemory(boolean inMemory) {
this.inMemory = inMemory;
}
public boolean isPooled() {
return this.pooled;
}
public void setPooled(boolean pooled) {
this.pooled = pooled;
}
public String getUser() {
return this.user;
}
public void setUser(String user) {
this.user = user;
}
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
}
Efectivamente, lo que hace es mapear las propiedades spring.activemq.*
sus respectivas propiedades.
Si utiliza el tipo de código anterior, no @Value
usar @Value
en cada campo.
Para el ejemplo específico de DataSource que está mostrando, Spring Boot a partir de la versión 1.1.0.M1
proporciona el DataSourceBuilder
que se basa en @ConfigurationProperties
y simplifica enormemente el tipo de configuración que está tratando de lograr. Vea la documentación aquí
En tu caso, el código sería:
@Bean
@ConfigurationProperties(prefix="txn")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix="rpt")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
En la clase de configuración de Spring a continuación, estoy cargando el archivo app.properties a través de @PropertySource y construyendo 2 fuentes de datos DBCP diferentes utilizando las configuraciones del archivo de propiedades.
Aunque todo funciona bien, no me gusta declarar una variable para cada propiedad de configuración con una anotación para construir la fuente de datos. Traté de autoautar la clase de entorno de esta manera
@Autowired Environment env;
Sin embargo, cuando env.getProperty () devuelve nulo. ¿Hay una mejor manera de hacer esto?
@Configuration
@PropertySource("classpath:app.properties")
public class DAOConfig {
@Value( "${txn.dbhost}" ) private String txnDbHost;
@Value( "${txn.dbport}" ) private Integer txnDbPort;
@Value( "${txn.dbservice}" ) private String txnDbService;
@Value( "${txn.dbuser}" ) private String txnDbUser;
@Value( "${txn.dbpwd}" ) private String txnDbPwd;
@Value( "${rpt.dbhost}" ) private String rptDbHost;
@Value( "${rpt.dbport}" ) private Integer rptDbPort;
@Value( "${rpt.dbservice}" ) private String rptDbService;
@Value( "${rpt.dbuser}" ) private String rptDbUser;
@Value( "${rpt.dbpwd}" ) private String rptDbPwd;
@Bean(destroyMethod = "close")
public DataSource txnDataSource() {
return new DataSources.Builder()
.host(txnDbHost)
.port(txnDbPort)
.service(txnDbService)
.user(txnDbUser)
.pwd(txnDbPwd)
.build();
}
@Bean(destroyMethod = "close")
public DataSource rptDataSource() {
return new DataSources.Builder()
.host(rptDbHost)
.port(rptDbPort)
.service(rptDbService)
.user(rptDbUser)
.pwd(rptDbPwd)
.build();
}
}
Editar : Retiro eso sobre Environment.getProperty () que no funciona. De hecho, funciona Estaba dando nombres de propiedad incorrectamente. Para aquellos que no quieran usar Spring Boot, pueden autocablear el Entorno como lo usan de la siguiente manera:
@Configuration
@PropertySource("classpath:app.properties")
public class DAOConfig {
@Autowired Environment env;
@Bean(destroyMethod = "close")
public DataSource txnDataSource() {
return new DataSources.Builder()
.host(env.getProperty("txn.dbhost"))
.port(env.getProperty("txn.dbport"))
.service(env.getProperty("txn.dbservice"))
.user(env.getProperty("txn.dbuser"))
.pwd(env.getProperty("txn.dbpwd"))
.build();
}
}