如何在Spring Boot中访问application.properties文件中定义的值


312

我想访问中提供的值application.properties,例如:

logging.level.org.springframework.web: DEBUG
logging.level.org.hibernate: ERROR
logging.file=${HOME}/application.log

userBucket.path=${HOME}/bucket

我想userBucket.path在Spring Boot应用程序的主程序中访问。

Answers:


467

您可以使用@Value批注并在使用的任何Spring bean中访问属性

@Value("${userBucket.path}")
private String userBucketPath;

Spring Boot文档的“ 外部化配置”部分介绍了您可能需要的所有详细信息。


5
作为替代方案,也可以从春季Environment或通过@ConfigurationProperties
索迪克2015年

3
为了补充@sodik的答案,这是一个示例,显示了如何获取环境 stackoverflow.com/questions/28392231/…–
cristi

如果您需要访问10个以上的值,该怎么办,是否必须将示例重复10次?
杰西

一种方法是这样做,但是很麻烦。有基于替代方法@Configuration的类,问题以及分析在下面的博客文章
主从

2
请注意,这仅适用于@Component(或任何其衍生产品@Repository,例如等等)
Janac Meena

210

另一种方法是注入org.springframework.core.env.Environment您的bean。

@Autowired
private Environment env;
....

public void method() {
    .....  
    String path = env.getProperty("userBucket.path");
    .....
}

6
当您需要访问的属性的名称动态更改时,它也很有用
Paulo Merson 17'July

3
如果要搜索属性怎么办?并且我可能建议包括import语句,以便所有人都可以看到Environment包名称,可能是org.springframework.core.env.Environment
chrisinmtown

2
注意不要导入错误的环境。我intellij自动导入了CORBA环境。
Janac Meena

3
为什么我的env为空?
Janac Meena

2
@JanacMeena遇到了与IntelliJ自动导入CORBA的类相同的问题,而不是org.springframework.core.env.Environment
Rasshu

31

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

}

1
我使用这种方法并得到了null返回值,我将我的属性文件放在src / test / resources中,并将属性java类(其中保存了属性值)放在src / main / package / properties中。我一直在想什么?谢谢
艾哈迈德·里奥·尤丹托

src/main/resources如果不通过Spring测试来测试代码,则必须将文件保存到。
乔布斯

与@AhmadLeoYudanto一样,我无法做任何改变
Dimitri Kopriwa

6

目前,我了解以下三种方式:

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>
  • PropertySouceEnvironment加载类时,从属性源文件中的变量(在您的类中)中设置值。这样您就可以轻松获取后记。
    • 可通过系统环境变量访问。

3. @ConfigurationProperties注释。

  • 这通常在Spring项目中用于加载配置属性。
  • 它基于属性数据初始化实体。

    • @ConfigurationProperties 标识要加载的属性文件。
    • @Configuration 根据配置文件变量创建一个bean。
    @ConfigurationProperties(前缀=“用户”)
    @Configuration(“ UserData”)
    班级用户{
      //属性及其获取器/设置器
    }
    
    @Autowired
    私人UserData userData;
    
    userData.getPropertyName();

如果默认位置被覆盖spring.config.location怎么办?#2仍然有效吗?
bmauter

在这种情况下,优先考虑。据我所知,当您使用命令行设置spring.config.location时,它具有较高的优先级,因此它会覆盖现有的优先级。
Dhwanil Patel

5

您也可以用这种方式来做...。

@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"); 

1
什么包Environment
e-info128

1
在此处找到它:org.springframework.core.env.Environment
lucifer19'1

如果默认位置被覆盖spring.config.location怎么办?
bmauter

3

如果您将在一个位置使用此值,则可以使用@Value从中加载变量application.properties,但是如果需要更集中的方式来加载此变量,@ConfigurationProperties则是一种更好的方法。

此外,如果您需要不同的数据类型来执行验证和业务逻辑,则可以加载变量并自动将其强制转换。

application.properties
custom-app.enable-mocks = false

@Value("${custom-app.enable-mocks}")
private boolean enableMocks;

3

按着这些次序。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.
}

1
1.Injecting a property with the @Value annotation is straightforward:
@Value( "${jdbc.url}" )
private String jdbcUrl;

2. we can obtain the value of a property using the Environment API

@Autowired
private Environment env;
...
dataSource.setUrl(env.getProperty("jdbc.url"));

1

应用程序可以从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; 

0

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


0

对我来说,以上任何一项都对我没有直接作用。我所做的如下:

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

0

获取属性值的最佳方法正在使用。

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

0

最好的办法是使用@Value注释,它将自动为您的对象分配值private Environment en。这将减少您的代码,并且很容易过滤文件。


0

有两种方法,

  1. 您可以@Value在课堂上直接使用
    @Value("#{'${application yml field name}'}")
    public String ymlField;

要么

  1. 为了使其整洁,您可以清洁@Configuration教室,在其中添加所有内容@value
@Configuration
public class AppConfig {

    @Value("#{'${application yml field name}'}")
    public String ymlField;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.