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