gpt4 book ai didi

java - 使用@PropertySource 配置 Spring 属性

转载 作者:行者123 更新时间:2023-11-30 07:08:25 24 4
gpt4 key购买 nike

在下面的 Spring 配置类中,我通过 @PropertySource 加载 app.properties 文件,并使用属性文件中的配置构建 2 个不同的 DBCP 数据源。

虽然一切正常,但我不喜欢为每个带有注释的配置属性声明一个变量来构造数据源。我试过像这样 Autowiring 环境类

@Autowired Environment env;

但是,当 env.getProperty() 返回 null 时。有一个更好的方法吗?

@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();
}
}

编辑:我收回关于 Environment.getProperty() 不起作用的说法。它确实有效。我错误地提供了属性名称。对于那些不想使用 Spring Boot 的人,您可以按如下方式 Autowiring 环境:

@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();
}

}

最佳答案

如果您正在使用(或愿意使用)Spring Boot,那么您可以使用 @ConfigurationProperties 注释。

这是来自 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;
}

}

实际上,这是将属性 spring.activemq.* 映射到它们各自的属性。

使用前一种代码可以避免在每个字段上使用 @Value

对于您展示的特定 DataSource 示例,从版本 1.1.0.M1 开始的 Spring Boot 提供了构建在 @ConfigurationProperties 上的 DataSourceBuilder > 并极大地简化了您要实现的配置类型。请参阅文档 here

在您的情况下,代码将是:

@Bean
@ConfigurationProperties(prefix="txn")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}

@Bean
@ConfigurationProperties(prefix="rpt")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}

关于java - 使用@PropertySource 配置 Spring 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23981670/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com