BeanWrapper — это инструмент, предоставляемый Spring для управления свойствами javaBean, который может напрямую изменять свойства объекта.
Для работы со свойствами бина нам в основном знакомы следующие классы инструментов:
- 1. Apache BeanUtils и PropertyUtils
- 2. BeanMap и BeanCopier из cglib
- 3. Spring BeanUtils
Основные функции BeanWrapper в Spring:
- 1. Поддержка установки вложенных свойств
- 2. Поддержка преобразования типов значений атрибутов (установить ConversionService)
- 3. Предоставляет операции для разбора и управления стандартными компонентами JavaBeans: возможность получать и устанавливать значения свойств (отдельно или в пакетах), получать дескрипторы свойств и запрашивать доступность свойств для чтения/записи.
BeanWrapper сам по себе является интерфейсом, предоставляющим полный набор методов для работы с bean-компонентами. Исходный код выглядит следующим образом:
public interface BeanWrapper extends ConfigurablePropertyAccessor {
//为数组和集合自动增长指定一个限制。在普通的BeanWrapper上默认是无限的。
void setAutoGrowCollectionLimit(int autoGrowCollectionLimit);
//返回数组和集合自动增长的限制。
int getAutoGrowCollectionLimit();
//如果有的话,返回由此对象包装的bean实例
Object getWrappedInstance();
//返回被包装的JavaBean对象的类型。
Class<?> getWrappedClass();
//获取包装对象的PropertyDescriptors(由标准JavaBeans自省确定)。
PropertyDescriptor[] getPropertyDescriptors();
//获取包装对象的特定属性的属性描述符。
PropertyDescriptor getPropertyDescriptor(String propertyName) throws InvalidPropertyException;
}
Вышеупомянутый BeanWrapper основан на версии 4.3.6, и этот интерфейс был немного изменен после версии 4.1. BeanWrapperImpl — это класс реализации BeanWrapper.Родительским классом BeanWrapperImpl является AbstractNestablePropertyAccessor, через который BeanWrapper может обрабатывать свойства.
Вот пример упаковки объекта с помощью BeanWrapper:
package com.glmapper.spring.test;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.PropertyAccessorFactory;
import org.springframework.beans.PropertyValue;
/**
* BeanWrapper 测试类
*/
public class BeanWrapperTest {
public static void main(String[] args) {
User user=new User();
//通过PropertyAccessorFactory将user对象封装成BeanWrapper
BeanWrapper bw=PropertyAccessorFactory.forBeanPropertyAccess(user);
//方式一:直接对属性值进行设置
bw.setPropertyValue("userName", "张三");
//方式二:通过PropertyValue进行设置
PropertyValue pv=new PropertyValue("userName","李四");
bw.setPropertyValue(pv);
System.out.println(user.getUserName());
}
}
//一个User类
class User{
private String userName;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
В Spring многие операции с атрибутами Bean выполняются через BeanWrapper, например, общая настройка атрибута HttpServletBean.
注:本文摘自我的博客园文章,进行了一些包装,放在Spring源码系列中。
BeanWrapper весной
欢迎关注微信公众号