Spring Data Binding

Spring Data Binding là cơ chế để liên kết động dữ liệu nhập của người dùng với JavaBean. Nói cách khác, cơ chế Spring Data Binding là cách để thiết lập giá trị thuộc tính vào đối tượng mục tiêu.

Trong Spring, chức năng Data Binding chủ yếu được thực hiện bởi lớp DataBinder. Ngoài ra, BeanWrapper cũng có chức năng tương tự, nhưng DataBinder hỗ trợ thêm kiểm tra trường, định dạng trường và phân tích kết quả liên kết.

Bắt đầu nhanh

Định nghĩa một JavaBean để kiểm tra

public class TestBean {
 
    private int num;
 
    public int getNum() {
        return num;
    }
 
    public void setNum(int num) {
        this.num = num;
    }
 
    @Override
    public String toString() {
        return "TestBean{" + "num=" + num + '}';
    }
 
}

Ví dụ về Data Binding

public class DataBindingDemo {
 
    public static void main(String[] args) {
 
        MutablePropertyValues mpv = new MutablePropertyValues();
        mpv.add("num", "10");
 
        TestBean testBean = new TestBean();
        DataBinder db = new DataBinder(testBean);
 
        db.bind(mpv);
        System.out.println(testBean);
    }
 
}

Các tình huống sử dụng Spring Data Binding

  • Tạo Bean từ BeanDefinition trong Spring
  • Data Binding của Spring (DataBinder)
  • Data Binding tham số trong Spring Web (WebDataBinder)

DataBinder

Trong Spring, lớp DataBinder là lớp cơ sở cho chức năng Data Binding. WebDataBinder là một lớp con của DataBinder, được sử dụng chủ yếu cho Data Binding trong Spring Web. Ngoài ra, còn có một số lớp con mở rộng của WebDataBinder, như được hiển thị trong hình sau:

Các thuộc tính chính của lớp DataBinder:

Thuộc tínhMô tả
targetĐối tượng Bean liên kết
objectNameTên của đối tượng Bean
bindingResultKết quả liên kết thuộc tính
typeConverterBộ chuyển đổi kiểu
conversionServiceDịch vụ chuyển đổi kiểu
messageCodesResolverBộ giải mã mã lỗi kiểm tra
validatorsDanh sách các Validator liên kết

Phương thức chính của lớp DataBinderbind(PropertyValues): ánh xạ nội dung Key-Value của PropertyValues vào các thuộc tính của đối tượng Bean liên kết (target)

  • Giả sử PropertyValues chứa cặp khóa giá trị name=hnv99, và đối tượng Bean User có thuộc tính name, khi phương thức bind được thực thi, giá trị thuộc tính name trong đối tượng User sẽ được liên kết với hnv99.

Spring Data Binding Metadata

Metadata của DataBinder - PropertyValues

Đặc điểmMô tả
Nguồn dữ liệuBeanDefinition, chủ yếu từ cấu hình BeanDefinition của tài nguyên XML
Cấu trúc dữ liệuBao gồm một hoặc nhiều PropertyValue
Cấu trúc thành viênPropertyValue bao gồm tên thuộc tính và giá trị thuộc tính (bao gồm giá trị gốc và giá trị sau khi chuyển đổi kiểu)
Cài đặt phổ biếnMutablePropertyValues
Cài đặt mở rộng WebServletConfigPropertyValues, ServletRequestParameterPropertyValues
Liên quan đến vòng đờiInstantiationAwareBeanPostProcessor#postProcessProperties

Tham số điều khiển Data Binding của Spring

Phân tích các tình huống đặc biệt của DataBinder

  • Khi PropertyValues chứa PropertyValue với tên x, và đối tượng mục tiêu B không có thuộc tính x, điều gì xảy ra khi thực hiện phương thức bind?
  • Khi PropertyValues chứa PropertyValue với tên x, và đối tượng mục tiêu B có thuộc tính x, làm thế nào để tránh việc liên kết thuộc tính x của B?
  • Khi PropertyValues chứa PropertyValue với tên x.y, và đối tượng mục tiêu B có thuộc tính x (với thuộc tính lồng y), điều gì xảy ra khi thực hiện phương thức bind?

Tham số điều khiển DataBinder

Tên tham sốMô tả
ignoreUnknownFieldsCó bỏ qua các trường không xác định hay không, giá trị mặc định: true
ignoreInvalidFieldsCó bỏ qua các trường không hợp lệ hay không, giá trị mặc định: false
autoGrowNestedPathsCó tự động tăng đường dẫn lồng nhau hay không, giá trị mặc định: true
allowedFieldsDanh sách trường được phép liên kết
disallowedFieldsDanh sách trường không được phép liên kết
requiredFieldsDanh sách trường bắt buộc liên kết

Sử dụng BeanWrapper

  • Giao diện trung tâm của cơ sở hạ tầng JavaBeans của Spring
  • Thường không được sử dụng trực tiếp, được sử dụng gián tiếp thông qua BeanFactory và DataBinder
  • Cung cấp phân tích và thao tác Java Bean tiêu chuẩn, có thể lưu trữ thuộc tính (properties) của Java Bean độc lập hoặc theo lô
  • Hỗ trợ đường dẫn thuộc tính lồng nhau (nested path)
  • Implement: org.springframework.beans.BeanWrapperImpl

Thay thế cài đặt Java Beans cốt lõi của Spring

Cài đặt cốt lõi của JavaBeans - java.beans.BeanInfo

  • Thuộc tính (Property)
    • java.beans.PropertyEditor
  • Phương thức (Method)
  • Sự kiện (Event)
  • Biểu thức (Expression)

Cài đặt thay thế của Spring - org.springframework.beans.BeanWrapper

  • Thuộc tính (Property)
    • java.beans.PropertyEditor
  • Đường dẫn thuộc tính lồng nhau (nested path)

DataBinder và Data Validation

DataBinder và BeanWrapper

  • Phương thức bind tạo ra BeanPropertyBindingResult
  • BeanPropertyBindingResult liên kết với BeanWrapper

Câu hỏi

JavaBeans chuẩn thực hiện các thao tác thuộc tính như thế nào?

APIMô tả
java.beans.IntrospectorAPI Java Beans introspection
java.beans.BeanInfoAPI thông tin Java Bean
java.beans.BeanDescriptorMô tả thông tin Java Bean
java.beans.PropertyDescriptorMô tả thuộc tính Java Bean
java.beans.MethodDescriptorMô tả phương thức Java Bean
java.beans.EventSetDescriptorMô tả tập sự kiện Java Bean