Ответ
Spring Boot загружает свойства из множества источников, соблюдая определённый порядок приоритета. Свойства из источников с более высоким приоритетом переопределяют свойства из источников с низким приоритетом.
Источники в порядке возрастания приоритета (от низкого к высокому):
- Дефолтные свойства (задаются
SpringApplication.setDefaultProperties). @PropertySourceна классах с@Configuration.@Configuration @PropertySource("classpath:custom.properties") public class MyConfig { }- Файлы конфигурации (
.propertiesили.yml):application.propertiesвнутри упакованного JAR (classpath:)- Файлы в директории
./config/относительно текущей директории. - Файлы в текущей директории (
./). - Профильные файлы (например,
application-dev.properties) имеют приоритет над основнымapplication.properties.
- Переменные окружения ОС (например,
export DB_HOST=localhost). - Java System Properties (
-Dаргументы JVM, например,-Dserver.port=8081). - Аргументы командной строки (например,
java -jar app.jar --server.port=8082).
Практическое использование и инъекция:
@Component
public class MyComponent {
// Инъекция значения напрямую
@Value("${app.page.size:10}") // Значение по умолчанию '10'
private int pageSize;
// Более структурированный подход через @ConfigurationProperties
@ConfigurationProperties(prefix = "app.datasource")
public class DataSourceProps {
private String url;
private String username;
// getters/setters
}
}
Ключевой вывод: Самый высокий приоритет у аргументов командной строки, затем системные свойства и переменные окружения. Это позволяет легко переопределять конфигурацию для разных сред (dev, prod) без изменения файлов приложения.