Spring Boot YAML vs Properties: So Sánh Cấu Hình và Câu Hỏi Phỏng Vấn 2026
So sánh application.yml và application.properties trong Spring Boot 4.1: cú pháp, file nhiều profile, quy tắc ưu tiên, secret mã hóa bằng Jasypt và các câu hỏi cấu hình thường gặp khi phỏng vấn.

Spring Boot hỗ trợ hai định dạng cấu hình chính: YAML (application.yml) và Properties (application.properties). Cả hai định dạng đều phục vụ cùng một mục đích, nhưng khác nhau về cú pháp, khả năng đọc và các trường hợp sử dụng cụ thể. Phần so sánh dưới đây chỉ ra sự khác biệt thực tế giữa hai định dạng và các câu hỏi phỏng vấn liên quan đến externalized configuration trong Spring Boot.
Sử dụng YAML cho các dự án có cấu hình lồng nhau sâu hoặc nhiều profile. Sử dụng Properties cho cấu hình đơn giản hoặc khi làm việc với team chưa quen với cú pháp YAML.
Tổng Quan Spring Boot Properties vs YAML
Trên Spring Boot 4.1, dòng phát hành hiện tại, cả hai định dạng đều nạp vào cùng một Environment và được bind theo cách giống hệt nhau. Khác biệt nằm ở cú pháp, một vài quy tắc nạp file và cách xử lý khi cả hai file cùng tồn tại.
| Tiêu chí | YAML | Properties |
|---|---|---|
| Cấu hình lồng nhau | Phân cấp tự nhiên | Ký hiệu dấu chấm |
| Nhiều profile trong một file | Dấu phân tách --- | Dấu phân tách #--- hoặc !--- |
| Cú pháp danh sách | Mảng YAML gốc | Ký hiệu chỉ số [0], [1] |
| Chú thích | # trên bất kỳ dòng nào | # hoặc ! trên bất kỳ dòng nào |
Nạp được bằng @PropertySource | Không | Có |
| Hai file cùng một vị trí | Bị ghi đè | Được ưu tiên |
| Độ khó khi học | Phụ thuộc thụt lề | Tối thiểu |
Hai dòng cuối là điều ứng viên thường bỏ sót. Tài liệu tham khảo external configuration của Spring Boot nêu rõ file YAML không thể nạp qua @PropertySource hay @TestPropertySource, và khi application.properties cùng application.yml nằm cạnh nhau, giá trị trong .properties sẽ thắng. Khuyến nghị chính thức là chọn một định dạng duy nhất cho toàn bộ ứng dụng.
So Sánh Cú Pháp Giữa YAML và Properties
Sự khác biệt rõ ràng nhất nằm ở cách mỗi định dạng biểu diễn dữ liệu phân cấp. File Properties sử dụng ký hiệu dấu chấm trên mỗi dòng, trong khi YAML sử dụng thụt lề để thể hiện cấu trúc lồng nhau.
# application.properties
server.port=8080
server.servlet.context-path=/api
spring.datasource.url=jdbc:postgresql://localhost:5432/mydb
spring.datasource.username=admin
spring.datasource.password=${DB_PASSWORD}
spring.jpa.hibernate.ddl-auto=validate
spring.jpa.show-sql=falseCấu hình YAML tương đương nhóm các thiết lập liên quan một cách trực quan:
# application.yml
server:
port: 8080
servlet:
context-path: /api
spring:
datasource:
url: jdbc:postgresql://localhost:5432/mydb
username: admin
password: ${DB_PASSWORD}
jpa:
hibernate:
ddl-auto: validate
show-sql: falseYAML giảm sự lặp lại khi nhiều thuộc tính có chung prefix. Trong file properties, spring.datasource xuất hiện ba lần, trong khi YAML chỉ khai báo một lần.
Quản Lý Profile trong Cấu Hình Spring Boot
Spring Boot profile cho phép cấu hình khác nhau cho môi trường development, staging và production. Cả hai định dạng đều hỗ trợ file riêng theo profile lẫn file nhiều document.
Cách tiếp cận truyền thống dùng một file cho mỗi profile:
# application-dev.properties
server.port=8080
spring.datasource.url=jdbc:h2:mem:devdb
logging.level.root=DEBUG
# application-prod.properties
server.port=80
spring.datasource.url=jdbc:postgresql://prod-server:5432/proddb
logging.level.root=WARNYAML hỗ trợ cú pháp multi-document trong một file duy nhất sử dụng dấu phân cách ---:
# application.yml
spring:
profiles:
active: dev
---
spring:
config:
activate:
on-profile: dev
server:
port: 8080
logging:
level:
root: DEBUG
---
spring:
config:
activate:
on-profile: prod
server:
port: 80
logging:
level:
root: WARNFile properties cũng hỗ trợ bố cục nhiều document tương tự. Một dòng chỉ chứa #--- (hoặc !---) sẽ tách file thành nhiều document:
# application.properties
spring.profiles.active=dev
#---
spring.config.activate.on-profile=dev
server.port=8080
logging.level.root=DEBUG
#---
spring.config.activate.on-profile=prod
server.port=80
logging.level.root=WARNDấu phân tách không được có khoảng trắng phía trước và phải gồm đúng ba dấu gạch nối. Từ Spring Boot 2.4, thuộc tính spring.config.activate.on-profile thay thế cú pháp spring.profiles cũ, ở cả hai định dạng.
"File properties cần một file cho mỗi profile" là câu trả lời sai rất phổ biến. File .properties nhiều document đã có từ Spring Boot 2.4. Hạn chế thực sự lại nằm ở phía YAML: YAML không thể nạp bằng @PropertySource.
Kích hoạt profile, profile group và bean @Profile được luyện tập trong module phỏng vấn về profile và environment.
Danh Sách và Cấu Trúc Dữ Liệu Phức Tạp
YAML vượt trội trong việc biểu diễn danh sách và cấu trúc lồng nhau. Điều này quan trọng cho các cấu hình như quy tắc bảo mật, ánh xạ CORS, hoặc bean tùy chỉnh.
# application.yml
app:
security:
allowed-origins:
- https://sharpskill.dev
- https://api.sharpskill.dev
cors:
allowed-methods:
- GET
- POST
- PUT
- DELETE
jwt:
secret: ${JWT_SECRET}
expiration-ms: 86400000Định dạng properties tương đương yêu cầu ký hiệu chỉ số:
# application.properties
app.security.allowed-origins[0]=https://sharpskill.dev
app.security.allowed-origins[1]=https://api.sharpskill.dev
app.security.cors.allowed-methods[0]=GET
app.security.cors.allowed-methods[1]=POST
app.security.cors.allowed-methods[2]=PUT
app.security.cors.allowed-methods[3]=DELETE
app.security.jwt.secret=${JWT_SECRET}
app.security.jwt.expiration-ms=86400000Thêm một origin mới vào file YAML chỉ cần thêm một dòng. Với properties, mỗi chỉ số hiện có phải giữ nguyên, và mục mới cần số chỉ số tiếp theo.
Sẵn sàng chinh phục phỏng vấn Spring Boot?
Luyện tập với mô phỏng tương tác, flashcards và bài kiểm tra kỹ thuật.
Cấu Hình Type-Safe với @ConfigurationProperties
Cả hai định dạng hoạt động giống hệt với cấu hình type-safe của Spring Boot. Lớp cấu hình ánh xạ các thuộc tính sang đối tượng Java có kiểu mạnh.
@ConfigurationProperties(prefix = "app.security")
public class SecurityProperties {
private List<String> allowedOrigins = new ArrayList<>();
private Cors cors = new Cors();
private Jwt jwt = new Jwt();
public static class Cors {
private List<String> allowedMethods = new ArrayList<>();
// getter và setter
}
public static class Jwt {
private String secret;
private long expirationMs;
// getter và setter
}
// getter và setter
}Kích hoạt lớp cấu hình với @EnableConfigurationProperties:
@SpringBootApplication
@EnableConfigurationProperties(SecurityProperties.class)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}Cấu Hình Biến Môi Trường
Cả hai định dạng hỗ trợ thay thế biến môi trường sử dụng cú pháp ${VAR_NAME} hoặc ${VAR_NAME:default}.
# application.yml
spring:
datasource:
url: ${DATABASE_URL:jdbc:postgresql://localhost:5432/devdb}
username: ${DATABASE_USER:postgres}
password: ${DATABASE_PASSWORD}# application.properties
spring.datasource.url=${DATABASE_URL:jdbc:postgresql://localhost:5432/devdb}
spring.datasource.username=${DATABASE_USER:postgres}
spring.datasource.password=${DATABASE_PASSWORD}Spring Boot cũng hỗ trợ binding biến môi trường linh hoạt. Biến môi trường SPRING_DATASOURCE_URL tự động ánh xạ sang spring.datasource.url. Các câu hỏi luyện tập thêm về những file này có trong module phỏng vấn application.properties và YAML.
Câu Hỏi Phỏng Vấn về Cấu Hình Spring Boot
Dưới đây là các câu hỏi phổ biến trong phỏng vấn kỹ thuật:
Sự khác biệt chính giữa application.yml và application.properties là gì?
YAML sử dụng thụt lề cho cấu trúc phân cấp, còn Properties sử dụng ký hiệu dấu chấm phẳng. Cả hai đều hỗ trợ nhiều profile trong một file: --- với YAML, #--- với properties. YAML dễ đọc hơn cho cấu hình lồng nhau, trong khi Properties đơn giản hơn cho thiết lập phẳng và là định dạng duy nhất nạp được bằng @PropertySource.
Thứ tự ưu tiên của các nguồn cấu hình trong Spring Boot là gì?
Spring Boot nạp cấu hình từ nhiều nguồn theo một thứ tự xác định. Nguồn có độ ưu tiên cao hơn sẽ ghi đè nguồn thấp hơn (bản rút gọn từ danh sách chính thức, vốn còn bao gồm JNDI, tham số servlet và các annotation dành cho test):
- Tham số dòng lệnh (
--server.port=9000) SPRING_APPLICATION_JSON(JSON inline trong biến môi trường hoặc system property)- Java system properties (
-Dserver.port=9000) - Biến môi trường của hệ điều hành (
SERVER_PORT=9000) - File config data (
application.yml,application.propertiesvà các biến thể theo profile) - Annotation
@PropertySource - Thuộc tính mặc định qua
SpringApplication.setDefaultProperties
Bên trong bước 5 còn có một thứ tự thứ hai: file theo profile ghi đè file chung, và file nằm ngoài jar đóng gói ghi đè file bên trong jar. Trong cùng một vị trí, .properties ghi đè .yml. Ứng viên giải thích được vì sao một giá trị đặt trong application.yml bị bỏ qua mà không có thông báo nào (do một file application.properties còn sót lại bên cạnh) cho thấy kinh nghiệm debug thực tế.
Có thể sử dụng cả hai cùng lúc không?
Có, Spring Boot tải cả hai nếu tồn tại. Properties có độ ưu tiên cao hơn YAML khi cùng một thuộc tính được định nghĩa ở cả hai file. Tuy nhiên, việc kết hợp cả hai dễ gây nhầm lẫn, vì vậy tài liệu chính thức khuyến nghị dùng một định dạng duy nhất cho toàn bộ ứng dụng.
Làm thế nào để ghi đè cấu hình cho testing?
Sử dụng @TestPropertySource hoặc @SpringBootTest với thuộc tính properties:
@SpringBootTest
@TestPropertySource(properties = {
"spring.datasource.url=jdbc:h2:mem:testdb",
"app.feature.enabled=false"
})
class ApplicationTests {
// test
}Hoặc tạo application-test.yml trong src/test/resources và kích hoạt với @ActiveProfiles("test"). File bổ sung nạp qua thuộc tính locations của @TestPropertySource phải là .properties, vì annotation này không nạp được YAML.
Relaxed binding là gì?
Relaxed binding cho phép các biến thể trong tên thuộc tính. app.databaseUrl, app.database-url, app.database_url, và APP_DATABASE_URL đều ánh xạ đến cùng một field. Điều này làm cho cấu hình linh hoạt qua các môi trường khác nhau.
Jasypt là gì và Jasypt mã hóa thuộc tính Spring Boot như thế nào?
Jasypt Spring Boot giải mã các giá trị được bọc trong ENC(...) khi Environment được khởi tạo, nhờ đó secret đã mã hóa có thể nằm trong application.yml hoặc application.properties và vẫn được bind như giá trị thông thường:
# application.properties
spring.datasource.password=ENC(nrmZtkF7T0kjG/VodDvBw93Ct8EgjCA+)# The master password is supplied at runtime, never committed
java -Djasypt.encryptor.password=$JASYPT_MASTER_KEY -jar app.jarjasypt.encryptor.password là thuộc tính bắt buộc duy nhất, và thuật toán mặc định là PBEWITHHMACSHA512ANDAES_256. Định dạng file không ảnh hưởng: cùng một giá trị ENC(...) hoạt động trong cả YAML lẫn properties.
Câu trả lời giúp phân biệt ứng viên senior: Jasypt không loại bỏ secret, mà chỉ di chuyển nó. Bất kỳ ai nắm master password đều giải mã được mọi giá trị trong repository, và việc xoay vòng master password đồng nghĩa với mã hóa lại toàn bộ. Vault hoặc secret manager của nhà cung cấp cloud bổ sung kiểm soát truy cập, audit và xoay vòng, những thứ Jasypt không có.
Starter 4.0.x (4.0.4, tháng 1/2026) yêu cầu Java 17 và Spring Boot 3.5+, và README của nó không liệt kê Spring Boot 4. Thư viện Jasypt bên dưới không có bản phát hành nào kể từ 1.9.3 vào tháng 5/2019. Starter cần được kiểm chứng trên một branch riêng trước khi chuyển dự án dùng Jasypt lên Spring Boot 4.
Cân Nhắc về Hiệu Năng
Parsing YAML yêu cầu thư viện SnakeYAML, đã được bao gồm trong Spring Boot starter. Thời gian parsing lâu hơn một chút so với properties, nhưng sự khác biệt không đáng kể vì cấu hình chỉ được phân tích khi khởi động.
Đối với production, cả hai định dạng có hiệu năng runtime giống hệt nhau vì chúng được chuyển đổi sang cùng một cấu trúc nội bộ sau khi tải.
Thực Hành Tốt Nhất cho Việc Chọn Định Dạng
Xem xét các yếu tố sau:
Chọn YAML khi:
- Dự án có nhiều profile cần quản lý
- Cấu hình có cấu trúc lồng nhau sâu
- Team quen thuộc với cú pháp YAML
- Cần danh sách và đối tượng phức tạp
Chọn Properties khi:
- Cấu hình chủ yếu phẳng
- Tích hợp với công cụ cũ chỉ hỗ trợ properties
- File bổ sung được nạp qua
@PropertySource, vốn không hỗ trợ YAML - Team thoải mái hơn với định dạng key-value đơn giản
- Dự án nhỏ với cấu hình tối thiểu
Chuyển Đổi Giữa Các Định Dạng
Việc chuyển đổi giữa các định dạng khá trực tiếp. Mỗi ký hiệu dấu chấm trong properties trở thành một cấp thụt lề trong YAML:
# Properties
spring.application.name=myapp
spring.datasource.hikari.maximum-pool-size=10# YAML
spring:
application:
name: myapp
datasource:
hikari:
maximum-pool-size: 10Nhiều IDE cung cấp chuyển đổi tự động. IntelliJ IDEA và VS Code có plugin chuyển đổi file cấu hình giữa các định dạng.
Lỗi Thường Gặp Cần Tránh
Một số lỗi thường xảy ra khi làm việc với cấu hình Spring Boot:
Lỗi thụt lề YAML: YAML nhạy cảm với khoảng trắng. Trộn lẫn tab và space gây ra lỗi parsing.
Giá trị boolean trong YAML: Các giá trị như yes, no, on, off được hiểu là boolean. Sử dụng dấu ngoặc kép cho giá trị chuỗi: enabled: "yes".
Ký tự đặc biệt trong Properties: Các ký tự như = và : trong giá trị cần escape hoặc dấu ngoặc kép.
# Đúng
app.url=https\://example.com\?param\=value
# Hoặc sử dụng dấu ngoặc kép trong YAMLapp:
url: "https://example.com?param=value"Nguồn Tham Khảo
- Tài liệu tham khảo Spring Boot: Externalized Configuration: thứ tự các property source, file properties nhiều document với
#---,.propertiesđược ưu tiên hơn YAML, YAML không dùng được với@PropertySource - Các bản phát hành Spring Boot: 4.1.2 là bản GA hiện hành (tháng 10/2026)
- README của Jasypt Spring Boot: cú pháp
ENC(...), thuật toán mặc định, yêu cầu Spring Boot 3.5+
Bắt đầu luyện tập!
Kiểm tra kiến thức với mô phỏng phỏng vấn và bài kiểm tra kỹ thuật.
Chọn YAML hay Properties trong Spring Boot 4.1
YAML và Properties đều là định dạng cấu hình hợp lệ trong Spring Boot. YAML mang lại khả năng đọc tốt hơn cho cấu hình phức tạp và danh sách. Properties cung cấp sự đơn giản cho thiết lập phẳng và khả năng tương thích rộng hơn với các công cụ. Cả hai định dạng đều hỗ trợ nhiều profile trong một file: --- với YAML, #--- với properties. Khi hai file nằm cùng một vị trí, .properties sẽ thắng, và chỉ file properties mới nạp được bằng @PropertySource. Giá trị ENC(...) của Jasypt chỉ chuyển secret sang master password. Việc lựa chọn phụ thuộc vào độ phức tạp của dự án, sở thích của team và yêu cầu tích hợp. Hiểu cả hai định dạng giúp developer đưa ra quyết định đúng đắn và sẵn sàng cho các câu hỏi phỏng vấn liên quan đến cấu hình Spring Boot.
Bạn có tìm ra lỗi trong Spring Boot không?
Một đoạn mã thật, một lỗi ẩn, mỗi ngày một lượt. Không cần tài khoản để thử.

Viết bởi
Anthony Fillion-MailletNgười sáng lập SharpSkill
Lập trình viên fullstack hơn 10 năm. Anh điều hành SharpSkill và chịu trách nhiệm về mọi nội dung đăng tại đây.
Cập nhật ngày 27 tháng 10, 2026
Thẻ
Chia sẻ
Bài viết liên quan

Việc làm Freelance Developer Java Spring Boot 2026: Tìm hợp đồng ở đâu, mức giá theo ngày, cách chuẩn bị
Hướng dẫn toàn diện cho developer freelance Java Spring Boot năm 2026: nền tảng tìm kiếm hợp đồng, mức giá theo ngày tại các quốc gia, và cách chuẩn bị cho phỏng vấn kỹ thuật.

Observability trong Spring Boot 2026: OpenTelemetry, Distributed Tracing va Cau hoi Phong van
Lam chu observability trong Spring Boot voi OpenTelemetry va Micrometer Tracing. Huong dan cau hinh distributed tracing, Observation API, xuat OTLP, va chuan bi phong van ky thuat.

Spring Modulith: Kiến trúc Monolith Mô-đun Giải thích
Học Spring Modulith để xây dựng monolith mô-đun trong Java. Kiến trúc, mô-đun, sự kiện bất đồng bộ, testing và observability với ví dụ mã Spring Boot 3 và 4.