SPring 中 BeanWrapper 的理解

「这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战

1. 定义

BeanWrapper 是 spring 在创建bean时,对bean的一个包装。它提供用于分析和操作标准JavaBean的操作:能够获取和设置属性值(单独或批量),获取属性描述符,并查询属性的可读写性。spring在创建对象前,首先就会创建一个 BeanWrapper ,它使得spring 可以以一种统一的方式,访问 bean 的属性。

1.1 类图

图片.png

  1. PropertAccessor : 属性访问控制器,主要控制bean属性的存取
  2. PropertyEditorRegistry : bean 属性编辑器的注册表,保存bean 的属性编辑器
  3. TypeConverter : 类型转换器,定义类型转换的方法接口。

通过上面的类图我们应该也能大概知道,它的主要作用是啥了:获取和设置属性值 Spring中默认的实现类是 org.springframework.beans.BeanWrapperImpl。我们主要通过BeanWrapperImpl 来讲解。

2. 方法简介

它的主要方法如下图:

image.png 其中灰色的方法,主要是它父接口中的方法,我在前面它的父接口中已经讲过了,这里就先不讲了,大家不懂的可以点上面的链接自己去看看。接下来我主要讲下图中的方法。 image.png

2.1 void setAutoGrowCollectionLimit(int autoGrowCollectionLimit)

主要作用:设置接收的数组或集合的最大长度限制。 默认实现: image.png image.png 说明:它可以会和下面的 int getAutoGrowCollectionLimit() 搭配演示

2.2 int getAutoGrowCollectionLimit()

主要作用:获取它设置的接收数组或集合的最大数限制 image.png

演示结果:

  1. 默认数量: image.png image.png
  2. 设置后的数量: image.png image.png

2.3 Object getWrappedInstance();

主要作用:返回此对象包装的bean实例。 默认实现: image.png image.png 这里 wrapperObject 主要是在在这里设置的 image.png

演示结果: image.png image.png 如果不设置,会抛异常: image.png image.png

2.4 Class<?> getWrappedClass();

主要作用:返回此对象包装的bean的class对象 默认实现: image.png 演示结果: image.png image.png

2.5 PropertyDescriptor[] getPropertyDescriptors();

主要作用:获取包装对象的所有PropertyDescriptor(属性修饰符) 默认实现: image.png 先获取beanWeapper 的 CachedIntrospectionResults(获取延迟初始化的CachedIntrospectionResults实例) image.png propertyDescriptorCache :缓存着 属性名--》PropertyDescriptor image.png 取出所有的 PropertyDescriptor 以数组的形式返回。 image.png 演示结果:

image.png image.png 这里面保存了该属性的很多信息,属性类型,读方法,写方法,等等。 image.png

2.6 PropertyDescriptor getPropertyDescriptor(String propertyName) throws InvalidPropertyException;

主要作用:根据属性名取出该属性的 PropertyDescriptor,取不到会抛异常 默认实现: getPropertyAccessorForPropertyPath :递归导航以返回嵌套属性路径的属性访问器 和上面差不多,从上面说的那个 cachedIntrospectionResults 通过名称取出它的 PropertyDescriptor image.png 演示结果:

image.png 第二个test 属性没有,则抛出了异常

image.png

3. 总结

讲完这些,主要是为了讲Spring bean 创建做铺垫,好了本文就讲到这里。

猜你喜欢

转载自juejin.im/post/7032600782021066766