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 YAML vs Properties Configuration

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.

Hướng Dẫn Lựa Chọn Nhanh

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íYAMLProperties
Cấu hình lồng nhauPhân cấp tự nhiênKý hiệu dấu chấm
Nhiều profile trong một fileDấu phân tách ---Dấu phân tách #--- hoặc !---
Cú pháp danh sáchMảng YAML gốcKý 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 @PropertySourceKhôngCó
Hai file cùng một vị tríBị ghi đèĐược ưu tiên
Độ khó khi họcPhụ 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.

properties
# 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=false

Cấ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:

yaml
# 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: false

YAML 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:

properties
# 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=WARN

YAML hỗ trợ cú pháp multi-document trong một file duy nhất sử dụng dấu phân cách ---:

yaml
# 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: WARN

File 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:

properties
# 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=WARN

Dấ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.

Bẫy phỏng vấn

"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.

yaml
# 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ố:

properties
# 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=86400000

Thê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.

java
@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:

java
@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}.

yaml
# application.yml
spring:
  datasource:
    url: ${DATABASE_URL:jdbc:postgresql://localhost:5432/devdb}
    username: ${DATABASE_USER:postgres}
    password: ${DATABASE_PASSWORD}
properties
# 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):

  1. Tham số dòng lệnh (--server.port=9000)
  2. SPRING_APPLICATION_JSON (JSON inline trong biến môi trường hoặc system property)
  3. Java system properties (-Dserver.port=9000)
  4. Biến môi trường của hệ điều hành (SERVER_PORT=9000)
  5. File config data (application.yml, application.properties và các biến thể theo profile)
  6. Annotation @PropertySource
  7. 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:

java
@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:

properties
# application.properties
spring.datasource.password=ENC(nrmZtkF7T0kjG/VodDvBw93Ct8EgjCA+)
bash
# The master password is supplied at runtime, never committed
java -Djasypt.encryptor.password=$JASYPT_MASTER_KEY -jar app.jar

jasypt.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ó.

Kiểm tra tương thích trước khi nâng cấp

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
# Properties
spring.application.name=myapp
spring.datasource.hikari.maximum-pool-size=10
yaml
# YAML
spring:
  application:
    name: myapp
  datasource:
    hikari:
      maximum-pool-size: 10

Nhiề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.

properties
# Đúng
app.url=https\://example.com\?param\=value
# Hoặc sử dụng dấu ngoặc kép trong YAML
yaml
app:
  url: "https://example.com?param=value"

Nguồn Tham Khảo

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.

Thử thách hôm nay

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ử.

Anthony Fillion-Maillet

Viết bởi

Anthony Fillion-Maillet

Ngườ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ẻ

#spring-boot
#yaml
#properties
#configuration
#java

Chia sẻ

Bài viết liên quan