Як отримати доступ до значення, визначеного у файлі 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анотацію та отримувати доступ до ресурсу в будь-якій весняній квасолі

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

Розділ « Зовнішня конфігурація» в документах Spring Boot пояснює всі деталі, які можуть вам знадобитися.


5
Як альтернативу, їх можна отримати також з весни Environmentабо через@ConfigurationProperties
sodik

3
Щоб додати поверх відповіді @ sodik, це приклад, який показує, як отримати середовище stackoverflow.com/questions/28392231/…
cristi

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

один підхід був би зробити це, але його громіздко. Існують альтернативні підходи, засновані на @Configurationзаняттях, проблема добре проаналізована в наступному дописі в блозі
Master Slave

2
Зауважте, це працює лише на @Component(або будь-яку з його похідних, тобто @Repositoryтощо)
Janac Meena

210

Ще один спосіб - впорскування org.springframework.core.env.Environmentв вашу квасолю.

@Autowired
private Environment env;
....

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

6
також корисно, коли назва об’єкта, до якого потрібно отримати доступ, змінюється динамічно
Пауло Мерсон

3
Що робити, якщо ви хочете здійснити пошук об’єктів? І я можу запропонувати включити імпорт імпорту, щоб усі могли побачити назву пакета Environment, ймовірно, org.springframework.core.env.Elvironment
chrisinmtown

2
Будьте обережні, щоб не імпортувати неправильне середовище. Я інтеглював автоматичне імпортне середовище CORBA.
Janac Meena

3
Чому мій env недійсний?
Janac Meena

2
@JanacMeena мала ту саму проблему, що і IntelliJ, що автоматично імпортує клас CORBA, а неorg.springframework.core.env.Environment
Rasshu

31

@ConfigurationPropertiesможе використовуватися для відображення значень з .properties( .ymlтакож підтримується) в POJO.

Розглянемо наступний прикладний файл.

.властивості

cust.data.employee.name=Sachin
cust.data.employee.dept=Cricket

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

ви повинні зберегти файли, 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змінній (у вашому класі) при завантаженні класу. Таким чином, ви зможете легко отримати післямови.
    • Доступний через змінну системного середовища.

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

  • В основному це використовується у весняних проектах для завантаження властивостей конфігурації.
  • Він ініціалізує об'єкт на основі даних про властивості.

    • @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.El Environment
люцифер

Що робити, якщо розташування за замовчуванням буде замінено на 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.

застосування.властивості


     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 полягає в використанні пружини @value annotation.Spring автоматично завантажує всі значення з YML в весняному середовищі, тому ми можемо безпосередньо використовувати ці значення з навколишнього середовища , як:

@Component
public class MySampleBean {

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

// ...

}

Або інший метод, який весною забезпечує читання сильно набраних бобів, полягає в наступному:

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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.