Spring boot 1.X và Spring Boot 2.X không cung cấp các tùy chọn và hành vi giống nhau về Externalized Configuration
.
Câu trả lời rất hay của M. Deinum đề cập đến các đặc điểm của Spring Boot 1.
Tôi sẽ cập nhật cho Spring Boot 2 tại đây.
Nguồn thuộc tính môi trường và thứ tự
Spring Boot 2 sử dụng một PropertySource
thứ tự rất đặc biệt được thiết kế để cho phép ghi đè hợp lý các giá trị. Các thuộc tính được xem xét theo thứ tự sau:
Thuộc tính cài đặt chung của Devtools trên thư mục chính của bạn (~ / .spring-boot-devtools.properties khi devtools đang hoạt động).
@TestPropertySource
chú thích về các bài kiểm tra của bạn.
@SpringBootTest#properties
thuộc tính chú thích trên các bài kiểm tra của bạn. Đối số dòng lệnh.
Thuộc tính từ SPRING_APPLICATION_JSON
(JSON nội tuyến được nhúng trong biến môi trường hoặc thuộc tính hệ thống).
ServletConfig
tham số init.
ServletContext
tham số init.
Thuộc tính JNDI từ java:comp/env
.
Thuộc tính hệ thống Java ( System.getProperties()
).
Các biến môi trường OS.
A RandomValuePropertySource
chỉ có thuộc tính ngẫu nhiên. *.
Thuộc tính ứng dụng cụ thể theo cấu hình bên ngoài jar được đóng gói của bạn ( application-{profile}.properties
và các biến thể YAML).
Thuộc tính ứng dụng cụ thể theo cấu hình được đóng gói bên trong jar của bạn ( application-{profile}.properties
và các biến thể YAML).
Thuộc tính ứng dụng bên ngoài jar được đóng gói của bạn ( application.properties
và các biến thể YAML).
Thuộc tính ứng dụng được đóng gói bên trong jar của bạn ( application.properties
và các biến thể YAML).
@PropertySource
chú thích về các @Configuration
lớp học của bạn . Thuộc tính mặc định (được chỉ định bởi cài đặt
SpringApplication.setDefaultProperties
).
Để chỉ định các tệp thuộc tính bên ngoài, các tùy chọn này sẽ khiến bạn quan tâm:
Thuộc tính ứng dụng cụ thể theo cấu hình bên ngoài jar được đóng gói của bạn ( application-{profile}.properties
và các biến thể YAML).
Thuộc tính ứng dụng bên ngoài jar được đóng gói của bạn ( application.properties
và các biến thể YAML).
@PropertySource
chú thích về các @Configuration
lớp học của bạn . Thuộc tính mặc định (được chỉ định bởi cài đặt
SpringApplication.setDefaultProperties
).
Bạn chỉ có thể sử dụng một trong 3 tùy chọn này hoặc kết hợp chúng tùy theo yêu cầu của bạn.
Ví dụ đối với các trường hợp rất đơn giản chỉ sử dụng các thuộc tính dành riêng cho cấu hình là đủ nhưng trong các trường hợp khác, bạn có thể muốn sử dụng cả các thuộc tính dành riêng cho cấu hình, thuộc tính mặc định và@PropertySource
.
Vị trí mặc định cho các tệp application.properties
Về application.properties
tệp (và biến thể), theo mặc định Spring sẽ tải chúng và thêm thuộc tính của chúng trong môi trường từ những tệp này theo thứ tự sau:
Các ưu tiên cao hơn theo đúng nghĩa đen:
classpath:/,classpath:/config/,file:./,file:./config/
.
Làm thế nào để sử dụng các tệp thuộc tính với các tên cụ thể?
Các vị trí mặc định không phải lúc nào cũng đủ: các vị trí mặc định như tên tệp mặc định ( application.properties
) có thể không phù hợp. Bên cạnh đó, như trong câu hỏi OP, bạn có thể cần chỉ định nhiều tệp cấu hình khác với application.properties
(và biến thể).
Vì thếspring.config.name
sẽ không đủ.
Trong trường hợp này, bạn nên cung cấp vị trí rõ ràng bằng cách sử dụng thuộc tính spring.config.location
môi trường (là danh sách các vị trí thư mục hoặc đường dẫn tệp được phân tách bằng dấu phẩy).
Để được miễn phí về mẫu tên tệp, hãy ưu tiên danh sách đường dẫn tệp trên danh sách thư mục.
Ví dụ làm như thế:
java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
Cách đó là chi tiết nhất chỉ xác định thư mục nhưng nó cũng là cách chỉ định rất tinh vi các tệp cấu hình của chúng tôi và ghi lại rõ ràng các thuộc tính được sử dụng hiệu quả.
spring.config.location hiện thay thế các vị trí mặc định thay vì thêm vào chúng
Với Spring Boot 1, spring.config.location
đối số thêm các vị trí được chỉ định trong môi trường Spring.
Nhưng từ Spring Boot 2, spring.config.location
thay thế các vị trí mặc định được Spring sử dụng bằng các vị trí được chỉ định trong môi trường Spring như đã nêu trong tài liệu .
Khi các vị trí cấu hình tùy chỉnh được định cấu hình bằng cách sử dụng
spring.config.location
, chúng sẽ thay thế các vị trí mặc định. Ví dụ: nếu spring.config.location
được định cấu hình với giá trị
classpath:/custom-config/
, file:./custom-config/
thứ tự tìm kiếm sẽ trở thành như sau:
file:./custom-config/
classpath:custom-config/
spring.config.location
bây giờ là một cách để đảm bảo rằng bất kỳ application.properties
tệp nào cũng phải được chỉ định rõ ràng.
Đối với các JAR uber không được dùng để đóng gói application.properties
tệp, điều đó khá hay.
Để giữ hành vi cũ spring.config.location
trong khi sử dụng Spring Boot 2, bạn có thể sử dụng thuộc tính mới spring.config.additional-location
thay vì thuộc tính spring.config.location
đó vẫn thêm các vị trí như đã nêu trong tài liệu :
Ngoài ra, khi các vị trí cấu hình tùy chỉnh được định cấu hình bằng cách sử dụng
spring.config.additional-location
, chúng sẽ được sử dụng ngoài các vị trí mặc định.
Trong thực tế
Vì vậy, giả sử rằng như trong câu hỏi OP, bạn có 2 tệp thuộc tính bên ngoài để chỉ định và 1 tệp thuộc tính có trong uber jar.
Để chỉ sử dụng các tệp cấu hình bạn đã chỉ định:
-Dspring.config.location=classpath:/job1.properties,classpath:/job2.properties,classpath:/applications.properties
Để thêm các tệp cấu hình vào các vị trí mặc định này:
-Dspring.config.additional-location=classpath:/job1.properties,classpath:/job2.properties
classpath:/applications.properties
trong ví dụ cuối cùng là không bắt buộc vì các vị trí mặc định có điều đó và các vị trí mặc định ở đây không bị ghi đè mà được mở rộng.
application.properties
sẽ luôn luôn được nạp, vớispring.config.location
bạn có thể thêm địa điểm cấu hình bổ sung được kiểm tra cho các tập tin (có nghĩa là khi nó kết thúc bằng một/
) tuy nhiên nếu bạn đặt một danh sách dấu phẩy tách trong đó mà điểm đến file đó sẽ được nạp. Điều này cũng được giải thích trong mùa xuân Boot Reference Guide đây