Answers:
您可以使用@Value
批注并在使用的任何Spring bean中访问属性
@Value("${userBucket.path}")
private String userBucketPath;
Spring Boot文档的“ 外部化配置”部分介绍了您可能需要的所有详细信息。
@Component
(或任何其衍生产品@Repository
,例如等等)
另一种方法是注入org.springframework.core.env.Environment
您的bean。
@Autowired
private Environment env;
....
public void method() {
.....
String path = env.getProperty("userBucket.path");
.....
}
org.springframework.core.env.Environment
@ConfigurationProperties
可用于将值.properties
(.yml
也受支持)映射到POJO。
考虑以下示例文件。
.properties
cust.data.employee.name=Sachin
cust.data.employee.dept=Cricket
Employee.java
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@ConfigurationProperties(prefix = "cust.data.employee")
@Configuration("employeeProperties")
public class Employee {
private String name;
private String dept;
//Getters and Setters go here
}
现在,可以通过自动装配employeeProperties
如下访问属性值。
@Autowired
private Employee employeeProperties;
public void method() {
String employeeName = employeeProperties.getName();
String employeeDept = employeeProperties.getDept();
}
src/main/resources
如果不通过Spring测试来测试代码,则必须将文件保存到。
目前,我了解以下三种方式:
1. @Value
注释
@Value("${<property.name>}")
private static final <datatype> PROPERTY_NAME;
null
。例如,当您尝试在一个preConstruct()
或多个方法中进行设置时init()
。发生这种情况是因为在完全构造了类之后才进行值注入。这就是为什么最好使用3'rd选项。2. @PropertySource
注解
<pre>@PropertySource("classpath:application.properties")
//env is an Environment variable
env.getProperty(configKey);</pre>
PropertySouce
Environment
加载类时,从属性源文件中的变量(在您的类中)中设置值。这样您就可以轻松获取后记。
3. @ConfigurationProperties
注释。
它基于属性数据初始化实体。
@ConfigurationProperties
标识要加载的属性文件。@Configuration
根据配置文件变量创建一个bean。@ConfigurationProperties(前缀=“用户”) @Configuration(“ UserData”) 班级用户{ //属性及其获取器/设置器 } @Autowired 私人UserData userData; userData.getPropertyName();
spring.config.location
怎么办?#2仍然有效吗?
您也可以用这种方式来做...。
@Component
@PropertySource("classpath:application.properties")
public class ConfigProperties {
@Autowired
private Environment env;
public String getConfigValue(String configKey){
return env.getProperty(configKey);
}
}
然后,无论您想从application.properties中读取什么,只需将密钥传递给getConfigValue方法即可。
@Autowired
ConfigProperties configProp;
// Read server.port from app.prop
String portNumber = configProp.getConfigValue("server.port");
Environment
?
spring.config.location
怎么办?
按着这些次序。1:-创建您的配置类,如下所示
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.beans.factory.annotation.Value;
@Configuration
public class YourConfiguration{
// passing the key which you set in application.properties
@Value("${userBucket.path}")
private String userBucket;
// getting the value from that key which you set in application.properties
@Bean
public String getUserBucketPath() {
return userBucket;
}
}
2:-如果有配置类,则从所需的配置中插入变量。
@Component
public class YourService {
@Autowired
private String getUserBucketPath;
// now you have a value in getUserBucketPath varibale automatically.
}
应用程序可以从application.properties文件中读取3种类型的值。
application.properties
my.name=kelly
my.dbConnection ={connection_srting:'http://localhost:...',username:'benz',password:'pwd'}
@Value("${my.name}")
private String name;
@Value("#{${my.dbConnection}}")
private Map<String,String> dbValues;
如果application.properties中没有属性,则可以使用默认值
@Value("${your_name : default value}")
private String msg;
Spring-boot提供了几种提供外部化配置的方法,您可以尝试使用application.yml或yaml文件而不是属性文件,并根据不同的环境提供不同的属性文件设置。
我们可以将每个环境的属性分离到单独的Spring配置文件下的单独yml文件中,然后在部署期间可以使用:
java -jar -Drun.profiles=SpringProfileName
指定要使用的弹簧配置文件。注意,yml文件的名称应类似于
application-{environmentName}.yml
使其由springboot自动处理。
参考:https : //docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-profile-specific-properties
要读取application.yml或属性文件:
从属性文件或yml读取值的最简单方法是使用spring @value注释。Spring会将yml中的所有值自动加载到spring环境中,因此我们可以直接从环境中使用这些值,例如:
@Component
public class MySampleBean {
@Value("${name}")
private String sampleName;
// ...
}
或者spring提供的另一种读取强类型bean的方法如下:
YML
ymca:
remote-address: 192.168.1.1
security:
username: admin
对应的POJO读取yml:
@ConfigurationProperties("ymca")
public class YmcaProperties {
private InetAddress remoteAddress;
private final Security security = new Security();
public boolean isEnabled() { ... }
public void setEnabled(boolean enabled) { ... }
public InetAddress getRemoteAddress() { ... }
public void setRemoteAddress(InetAddress remoteAddress) { ... }
public Security getSecurity() { ... }
public static class Security {
private String username;
private String password;
public String getUsername() { ... }
public void setUsername(String username) { ... }
public String getPassword() { ... }
public void setPassword(String password) { ... }
}
}
上面的方法适用于yml文件。
参考:https : //docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html
对我来说,以上任何一项都对我没有直接作用。我所做的如下:
除了@Rodrigo Villalba Zayas的答案之外,我还添加
implements InitializingBean
了该类
并实现了该方法
@Override
public void afterPropertiesSet() {
String path = env.getProperty("userBucket.path");
}
所以看起来像
import org.springframework.core.env.Environment;
public class xyz implements InitializingBean {
@Autowired
private Environment env;
private String path;
....
@Override
public void afterPropertiesSet() {
path = env.getProperty("userBucket.path");
}
public void method() {
System.out.println("Path: " + path);
}
}
获取属性值的最佳方法正在使用。
1.使用值注释
@Value("${property.key}")
private String propertyKeyVariable;
2.使用环境豆
@Autowired
private Environment env;
public String getValue() {
return env.getProperty("property.key");
}
public void display(){
System.out.println("# Value : "+getValue);
}
Environment
或通过@ConfigurationProperties