「这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战」
1. 定义
BeanWrapper 是 spring 在创建bean时,对bean的一个包装。它提供用于分析和操作标准JavaBean的操作:能够获取和设置属性值(单独或批量),获取属性描述符,并查询属性的可读写性。spring在创建对象前,首先就会创建一个 BeanWrapper ,它使得spring 可以以一种统一的方式,访问 bean 的属性。
1.1 类图
- PropertAccessor : 属性访问控制器,主要控制bean属性的存取
- PropertyEditorRegistry : bean 属性编辑器的注册表,保存bean 的属性编辑器
- TypeConverter : 类型转换器,定义类型转换的方法接口。
通过上面的类图我们应该也能大概知道,它的主要作用是啥了:获取和设置属性值 Spring中默认的实现类是 org.springframework.beans.BeanWrapperImpl。我们主要通过BeanWrapperImpl 来讲解。
2. 方法简介
它的主要方法如下图:
其中灰色的方法,主要是它父接口中的方法,我在前面它的父接口中已经讲过了,这里就先不讲了,大家不懂的可以点上面的链接自己去看看。接下来我主要讲下图中的方法。
2.1 void setAutoGrowCollectionLimit(int autoGrowCollectionLimit)
主要作用:设置接收的数组或集合的最大长度限制。
默认实现:
说明:它可以会和下面的 int getAutoGrowCollectionLimit() 搭配演示
2.2 int getAutoGrowCollectionLimit()
主要作用:获取它设置的接收数组或集合的最大数限制
演示结果:
- 默认数量:
- 设置后的数量:
2.3 Object getWrappedInstance();
主要作用:返回此对象包装的bean实例。
默认实现:
这里 wrapperObject 主要是在在这里设置的
演示结果:
如果不设置,会抛异常:
2.4 Class<?> getWrappedClass();
主要作用:返回此对象包装的bean的class对象
默认实现:
演示结果:
2.5 PropertyDescriptor[] getPropertyDescriptors();
主要作用:获取包装对象的所有PropertyDescriptor(属性修饰符)
默认实现:
先获取beanWeapper 的 CachedIntrospectionResults(获取延迟初始化的CachedIntrospectionResults实例)
propertyDescriptorCache :缓存着 属性名--》PropertyDescriptor
取出所有的 PropertyDescriptor 以数组的形式返回。
演示结果:
这里面保存了该属性的很多信息,属性类型,读方法,写方法,等等。
2.6 PropertyDescriptor getPropertyDescriptor(String propertyName) throws InvalidPropertyException;
主要作用:根据属性名取出该属性的 PropertyDescriptor,取不到会抛异常
默认实现:
getPropertyAccessorForPropertyPath :递归导航以返回嵌套属性路径的属性访问器
和上面差不多,从上面说的那个 cachedIntrospectionResults 通过名称取出它的 PropertyDescriptor
演示结果:
第二个test 属性没有,则抛出了异常
3. 总结
讲完这些,主要是为了讲Spring bean 创建做铺垫,好了本文就讲到这里。