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

Я хочу получить доступ к значениям, указанным в 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.

Ответ 1

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

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

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

Ответ 2

Другой способ - вставить среду в bean.

@Autowired
private Environment env;
....

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

Ответ 3

@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
}

Теперь к значению свойств можно обратиться с помощью autowiring employeeProperties следующим образом.

@Autowired
private Employee employeeProperties;

public void method() {

   String employeeName = employeeProperties.getName();
   String employeeDept = employeeProperties.getDept();

}

Ответ 4

Вы можете сделать это и так....

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

Ответ 5

Вы можете использовать @Value для загрузки переменных из application.properties если вы будете использовать это значение в одном месте, но если вам нужен более централизованный способ загрузки этих переменных, @ConfigurationProperties - лучший подход.

Кроме того, вы можете загружать переменные и автоматически приводить их, если вам нужны разные типы данных для проверки и бизнес-логики.

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

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

Ответ 6

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

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

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

    @PropertySource("classpath:application.properties")
    
    //env is an Environment variable
    env.getProperty(configKey);
    • PropertySouce устанавливает значения из исходного файла свойств в переменную Environment (в вашем классе), когда класс загружается. Таким образом, вы можете легко получить послесловие.
    • Доступно через переменную System Environment.
  3. @ConfigurationProperties аннотация.

    • В основном это используется в проектах Spring для загрузки свойств конфигурации.
    • Он инициализирует объект на основе данных свойства.
    • @ConfigurationProperties определяет файл свойств для загрузки.
    • @Configuration создает компонент на основе переменных файла конфигурации.
    @ConfigurationProperties(prefix = "user")
    @Configuration("UserData")
    class user {
      //Property & their getter / setter
    }
    
    @Autowired
    private UserData userData;
    
    userData.getPropertyName();

Ответ 7

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 автоматически загружает все значения из yml в среду @value, поэтому мы можем напрямую использовать эти значения из среды, например:

@Component
public class MyBean {

    @Value("${name}")
    private String name;

    // ...

}

Или другой метод, который предоставляет Spring для чтения строго типизированных bean-компонентов:

YML

acme:
    remote-address: 192.168.1.1
    security:
        username: admin
        roles:
          - USER
          - ADMIN

Соответствующий POJO для чтения yml:

@ConfigurationProperties("acme")
public class AcmeProperties {

    private boolean enabled;

    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;

        private List<String> roles = new ArrayList<>(Collections.singleton("USER"));

        public String getUsername() { ... }

        public void setUsername(String username) { ... }

        public String getPassword() { ... }

        public void setPassword(String password) { ... }

        public List<String> getRoles() { ... }

        public void setRoles(List<String> roles) { ... }

    }
}

Вышеуказанный метод хорошо работает с файлами yml.

Ссылка: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

Ответ 8

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. 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

Ответ 9

Для меня ничего из вышеперечисленного не сработало напрямую для меня. Я сделал следующее:

В дополнение к ответу @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);
    }
}

Ответ 10

Лучше всего использовать аннотацию @Value, она автоматически присвоит значение вашему объекту "private Environment en". Это уменьшит ваш код и будет легко фильтровать ваши файлы.

Ответ 11

Лучшие способы получения значений свойств используются.

1. Использование аннотации Value

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