Как получить доступ к значению, определенному в файле 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
В настоящее время,
Я знаю о следующих трех способах:
@Value
аннотация
@Value("${<property.name>}")
private static final <datatype> PROPERTY_NAME;
- По моему опыту, есть ситуации, когда вы не
возможность получить значение или оно установлено на
null
.
Например,
когда вы пытаетесь установить его с помощью метода preConstruct()
или init()
.
Это происходит потому, что внедрение значения происходит после того, как класс полностью построен.
Вот почему лучше использовать 3-й вариант.
@PropertySource
аннотация
@PropertySource("classpath:application.properties")
//env is an Environment variable
env.getProperty(configKey);
PropertySouce
устанавливает значения из исходного файла свойств в переменную Environment
(в вашем классе), когда класс загружается.
Таким образом, вы можете легко получить послесловие.
- Доступно через переменную System Environment.
@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);
}