Chi tiết về việc tải thuộc tính trong Spring Boot
Thứ tự tải thuộc tính
Spring Boot tải thuộc tính theo thứ tự sau:
- Cấu hình toàn cầu của Devtools (khi devtools được kích hoạt
~/.spring-boot-devtools.properties
). - Cấu hình từ chú thích
@TestPropertySource
trong môi trường kiểm thử. - Thuộc tính trong môi trường kiểm thử:
@SpringBootTest
và các chú thích kiểm thử khác. - Tham số dòng lệnh.
- Thuộc tính
SPRING_APPLICATION_JSON
. - Tham số khởi tạo của
ServletConfig
. - Tham số khởi tạo của
ServletContext
. - Thuộc tính JNDI từ các thuộc tính được cấu hình thông qua
java:comp/env
. - Thuộc tính hệ thống Java (
System.getProperties()
). - Biến môi trường hệ điều hành.
- Thuộc tính ngẫu nhiên từ
RandomValuePropertySource
với các thuộc tính có định dạngrandom.*
. - Cấu hình ngoài jar:
application-{profile}.properties
hoặcapplication-{profile}.yml
. - Cấu hình trong jar:
application-{profile}.properties
hoặcapplication-{profile}.yml
. - Cấu hình ngoài jar:
application.properties
hoặcapplication.yml
. - Cấu hình trong jar:
application.properties
hoặcapplication.yml
. - Cấu hình được liên kết với
@PropertySource
. - Thuộc tính mặc định (được chỉ định bằng
SpringApplication.setDefaultProperties
).
Thuộc tính ngẫu nhiên
Lớp RandomValuePropertySource
được sử dụng để cấu hình giá trị ngẫu nhiên.
Ví dụ:
Thuộc tính dòng lệnh
Mặc định, SpringApplication
sẽ lấy các tham số --
(ví dụ: --server.port=9000
) và thêm thuộc tính này vào Environment
của Spring.
Nếu bạn không muốn tải thuộc tính từ dòng lệnh, bạn có thể vô hiệu hóa nó bằng cách sử dụng SpringApplication.setAddCommandLineProperties(false)
.
Tệp thuộc tính ứng dụng
SpringApplication
sẽ tự động tải thuộc tính từ tệp cấu hình application.properties
trong các đường dẫn sau và đưa các thuộc tính này vào Environment
của Spring.
- Thư mục
/config
trong thư mục hiện tại. - Thư mục hiện tại.
- Gói
/config
trong classpath. - Gốc classpath.
Lưu ý:
Các tệp cấu hình trong danh sách trên sẽ được ghi đè bởi các tệp cấu hình sau. Bạn có thể sử dụng tệp cấu hình YAML để thay thế tệp cấu hình properties.
Nếu bạn không muốn sử dụng application.properties
làm tên tệp cấu hình, bạn có thể sử dụng biến môi trường spring.config.name
để thay thế:
$ java -jar myproject.jar --spring.config.name=myproject
Bạn cũng có thể sử dụng biến môi trường spring.config.location
để chỉ định đường dẫn của tệp cấu hình:
Thuộc tính theo profile
Nếu bạn định nghĩa các tệp cấu hình theo định dạng application-{profile}.properties
, chúng sẽ được coi là cấu hình đặc biệt cho môi trường profile
tương ứng.
Bạn có thể kích hoạt profile bằng cách sử dụng tham số spring.profiles.active
. Nếu không có profile nào được kích hoạt, mặc định sẽ tải cấu hình từ application-default.properties
.
Placeholder trong thuộc tính
Giá trị trong application.properties
sẽ được lọc qua Environment
, vì vậy bạn có thể tham chiếu đến các thuộc tính đã được định nghĩa trước đó.
app.name=MyApp
app.description=${app.name} là một ứng dụng Spring Boot
Lưu ý: Bạn có thể sử dụng kỹ thuật này để tạo biến thuộc tính Spring Boot. Xem chi tiết: Section 77.4, “Use ‘Short’ Command Line Arguments
Thuộc tính YAML
Spring Framework có hai lớp hỗ trợ tải tệp YAML.
YamlPropertiesFactoryBean
chuyển cấu hình từ tệp YAML thànhProperties
.YamlMapFactoryBean
chuyển cấu hình từ tệp YAML thànhMap
.
Ví dụ 1:
Tương đương với:
YAML hỗ trợ cú pháp danh sách, tương đương với [index]
trong thuộc tính:
Tương đương với:
Truy cập thuộc tính
Lớp YamlPropertySourceLoader
chuyển cấu hình YAML thành PropertySource
trong lớp Environment
của Spring. Sau đó, bạn có thể truy cập các thuộc tính được cấu hình trong YAML bằng cách sử dụng chú thích @Value
như các thuộc tính trong tệp properties.
Cấu hình đa profile
Nhược điểm của YAML
Lưu ý rằng các thuộc tính được chú thích trong YAML không thể truy cập bằng chú thích @PropertySource
. Vì vậy, nếu dự án của bạn sử dụng một số tệp thuộc tính tùy chỉnh, hãy tránh sử dụng YAML.
Tiền tố thuộc tính
Tương đương với việc cấu hình các thuộc tính sau:
acme.enabled
acme.remote-address
acme.security.username
acme.security.password
acme.security.roles
Sau đó, bạn cần sử dụng chú thích @EnableConfigurationProperties
để chèn lớp thuộc tính vào lớp cấu hình.
Quy tắc ràng buộc thuộc tính lỏng lẻo
Spring Boot có quy tắc ràng buộc tên thuộc tính linh hoạt.
Các khóa thuộc tính sau đây là tương đương:
Thuộc tính | Ghi chú |
---|---|
acme.my-project.person.first-name | Phân cách bằng - |
acme.myProject.person.firstName | Tên kiểu lạc đà |
acme.my_project.person.first_name | Phân cách bằng _ |
ACME_MYPROJECT_PERSON_FIRSTNAME | Chữ in hoa |
Chuyển đổi thuộc tính
Nếu bạn cần chuyển đổi kiểu dữ liệu, bạn có thể cung cấp một bean ConversionService
(một bean có tên là conversionService
) hoặc cấu hình thuộc tính tùy chỉnh (một bean CustomEditorConfigurer
) hoặc chuyển đổi tùy chỉnh (các bean được chú thích bằng @ConfigurationPropertiesBinding
).
Chuyển đổi đơn vị thời gian
Spring sử dụng lớp java.time.Duration
để đại diện cho thời gian, áp dụng các quy tắc sau:
- Một số long mặc định được coi là mili giây, trừ khi được chỉ định bằng
@DurationUnit
. - Định dạng chuẩn ISO-8601 (được triển khai bởi
java.time.Duration
). - Bạn cũng có thể sử dụng các đơn vị hỗ trợ sau:
ns
- nanosecond (nanogisecond)us
- microsecond (microsecond)ms
- millisecond (mili giây)s
- second (giây)m
- minute (phút)h
- hour (giờ)d
- day (ngày)
Ví dụ:
Chuyển đổi kích thước dữ liệu
Spring sử dụng lớp DataSize
để đại diện cho kích thước dữ liệu, áp dụng các quy tắc sau:
- Giá trị long (mặc định coi là byte).
- Bạn cũng có thể sử dụng các đơn vị hỗ trợ sau:
B
- byteKB
- kilobyteMB
- megabyteGB
- gigabyteTB
- terabyte
Ví dụ:
Kiểm tra thuộc tính
Bạn cũng có thể tạo một bean kiểm tra tùy chỉnh có tên là configurationPropertiesValidator
. Phương thức nhận @Bean
phải được khai báo là static
.