Как получить доступ к значению, определенному в файле application.properties в Spring Boot


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.

Ответы:


467

Вы можете использовать @Valueаннотацию и получить доступ к свойству в любом компоненте Spring, который вы используете

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

В разделе « Внешняя конфигурация » документации Spring Boot объясняются все детали, которые могут вам понадобиться.


5
в качестве альтернативы можно получить их также весной Environmentили через@ConfigurationProperties
sodik

3
Чтобы добавить в верхней части @ Содика отвечают, это пример , который показывает , как получить экологический stackoverflow.com/questions/28392231/...
Cristi

Что если вам нужно получить доступ к более чем 10 значениям, вам придется повторять свой пример 10 раз?
Джесси

Один из подходов - сделать это, но это громоздко. Есть альтернативные подходы, основанные на @Configurationклассах, проблема хорошо проанализирована в следующем сообщении в блоге
Master Slave

2
Обратите внимание, что это работает только на @Component(или любой из его производных @Repository, т.
Е.

211

Другой способ - это инъекция org.springframework.core.env.Environmentв ваш боб.

@Autowired
private Environment env;
....

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

6
также полезно, когда имя свойства, к
Пауло

3
Что делать, если вы хотите искать свойства? И могу ли я предложить включить оператор import, чтобы все могли видеть имя пакета Environment, возможно, org.springframework.core.env.Environment
chrisinmtown

2
Будьте осторожны, чтобы не импортировать неправильную среду. Я автоматически импортировал среду CORBA.
Янак Мина

3
Почему мой env нулевой?
Янак Мина,

2
У @JanacMeena была та же проблема с org.springframework.core.env.Environment
автоимпортированием

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
Я использовал этот способ и получил нулевой возврат, я поместил свой файл свойств в java-класс src / test / resources и properties (в котором сохраняется значение свойств) в src / main / package / properties. что я пропустил? спасибо
Ахмад Лео Юданто

Вы должны сохранить файлы, src/main/resourcesесли вы не тестируете свой код из теста Spring.
JoBⅈN

То же, что @AhmadLeoYudanto, и я ничего не могу сделать, чтобы это изменить
Дмитрий Коприва,

6

В настоящее время я знаю о следующих трех способах:

1. @ValueАннотация

    @Value("${<property.name>}")
    private static final <datatype> PROPERTY_NAME;
  • По моему опыту, есть ситуации, когда вы не можете получить значение или оно установлено на null. Например, когда вы пытаетесь установить его в preConstruct()метод или init()метод. Это происходит потому, что внедрение значения происходит после того, как класс полностью построен. Вот почему лучше использовать 3-й вариант.

2. @PropertySourceАннотация

<pre>@PropertySource("classpath:application.properties")

//env is an Environment variable
env.getProperty(configKey);</pre>
  • PropertySouceустанавливает значения из исходного файла свойств в Environmentпеременную (в вашем классе), когда класс загружается. Таким образом, вы можете легко получить послесловие.
    • Доступно через переменную System Environment.

3. @ConfigurationPropertiesАннотация.

  • В основном это используется в проектах Spring для загрузки свойств конфигурации.
  • Он инициализирует объект на основе данных свойства.

    • @ConfigurationProperties определяет файл свойств для загрузки.
    • @Configuration создает компонент на основе переменных файла конфигурации.
    @ConfigurationProperties (prefix = "user")
    @Configuration ( "UserData")
    класс user {
      // Свойство и их получатель / установщик
    }
    
    @Autowired
    личные данные пользователя userData;
    
    userData.getPropertyName ();

Что если местоположение по умолчанию переопределено spring.config.location? # 2 все еще работает?
bmauter

В таком случае приоритет приходит на место. Как я знаю, когда вы устанавливаете spring.config.location с помощью командной строки, он имеет высокий приоритет, поэтому он переопределяет существующий.
Дхванил Патель

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
lucifer

Что если местоположение по умолчанию переопределено 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

Приложение может прочитать 3 типа значений из файла application.properties.

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 вместо файла свойств и предоставить разные файлы свойств для настройки в соответствии с различными средами.

Мы можем разделить свойства для каждой среды на отдельные файлы 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 annotation.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. Использование компонента Enviornment

@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;
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.