Binding properties trong Spring Boot với annotation @ConfigurationProperties

Mình đã giới thiệu với các bạn về annotation @Value để ingest giá trị của các property nằm trong các tập tin properties với Spring framework. Tất nhiên, chúng ta cũng có thể sử dụng annotation @Value này trong Spring Boot. Thế nhưng, trong Spring Boot, chúng ta cũng có một annotation khác là @ConfigurationProperties để làm việc này. Sự khác nhau giữa 2 annotation là gì và tại sao họ lại tạo thêm mới một annotation khác để ingest giá trị của các property trong tập tin properties? Hãy cùng tìm hiểu trong bài viết này các bạn nhé!

Đầu tiên, mình sẽ tạo một Spring Boot project như sau:

Binding properties trong Spring Boot với annotation @ConfigurationProperties

Trong đó, class SpringBootConfigurationPropertiesApplication implement interface CommandLineRunner để có thể chạy Java console, với nội dung ban đầu như sau:

Class Student sẽ chứa thông tin sinh viên với một số thuộc tính như sau:

Tập tin student.properties chứa thông tin của sinh viên với nội dung như sau:

Sử dụng annotation @Value, chúng ta có thể ingest giá trị của những properties nằm trong tập tin student.properties vào đối tượng Student

rồi hiển thị các thông tin này ra console như sau:

Kết quả:

Binding properties trong Spring Boot với annotation @ConfigurationProperties

Nếu bây giờ, các bạn sử dụng annotation @ConfigurationProperties trong class Student bằng cách khai báo như sau:

chạy lại thì kết quả vẫn tương tự.

Như các bạn thấy, với việc sử dụng annotation @ConfigurationProperties, mình không cần phải khai báo thuộc tính nào của đối tượng Student sẽ được ingest vào giá trị của property nào trong tập tin student.properties. Mọi thứ đều hoàn toàn tự động.

Để làm được điều này, tất nhiên chúng ta phải tuân theo một số nguyên tắc các bạn nhé! 🙂

Ở ví dụ trên, “student” chính là prefix mà annotation @ConfigurationProperties sẽ sử dụng để tự động ingest các properties trong tập tin student.properties. Những properties nào bắt đầu là “student” và phần còn lại trùng với tên thuộc tính của đối tượng Student sẽ được ingest giá trị vào thuộc tính đó của đối tượng Student. Ở đây, phần còn lại của những properties này sẽ không phân biệt hoa, thường, gạch dưới hay gạch ngang nhé các bạn.

Ví dụ, mình có thể khai báo tập tin student.properties như sau:

thì kết quả vẫn như vậy nha các bạn! Cái này người ta gọi là relaxed binding. 🙂

Tất nhiên, nếu các properties của chúng ta không start với student:

thì các bạn không cần khai báo prefix trong annotation @ConfigurationProperties nữa:

Trong trường hợp đối tượng Student có chứa một collection hoặc array, ví dụ như:

thì các bạn có thể khai báo như sau trong tập tin student.properties để Spring Boot tự động ingest giá trị của biến scores vào đối tượng Student nhé:

Khi đó, kết quả sẽ là:

Binding properties trong Spring Boot với annotation @ConfigurationProperties

Trong trường hợp đối tượng Student còn chứa một đối tượng khác, ví dụ như:

thì với khai báo như sau trong tập tin properties:

Thông tin của đối tượng Address cũng được ingest như bình thường:

Binding properties trong Spring Boot với annotation @ConfigurationProperties

2.3/5 - (3 bình chọn)

Add Comment