org.springframework.beans.BeanWrapper接口

org.springframework.beans.BeanWrapper接口

1
2
3
public interface BeanWrapper extends ConfigurablePropertyAccessor{
//...
}

特点

  1. BeanWrapper是JavaBean底层架构的核心组件,一般不会直接使用,而是通过BeanFactory或者DataBinder隐式调用
  2. BeanWrapper提供分析、处理标准JavaBean的方法,包括 ——
  • get/set Bean property
  • 获取Bean propertydescriptor
  • 查询Bean Property是否可读/可写
  1. BeanWrapper的主要作用就是将一个Bean包起来,然后去get/set它的各种属性(property

    主要是通过调用PropertyAccessor接口实现的


父接口

【1】PropertyAccessor

PropertyAccessor接口主要用于操作Bean属性值

  1. get/set Bean property
  2. 批量get/set Bean property
  3. 查询Bean property是否可读/可写、
  4. 获取Bean propertydescriptor

修改(即set)一个Bean的特定property需要调用PropertyEditor接口,java.beans包下提供了一系列默认的PropertyEditor,用于修改常见的属性值,比如intList

【2】PropertyEditorRegistry

  • PropertyEditorRegistry接口的作用就是允许注册自定义的PropertyEditor,让Spring知道特定类型的属性值要通过哪个PropertyEditor进行操作

【3】TypeConverter

  • TypeConverter接口主要用于提供对类型转换的支持

实现类:BeanWrapperImpl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//缓存内省结果以提高效率
public class BeanWrapperImpl extends AbstractNestablePropertyAccessor
implements BeanWrapper{

//构造器
public BeanWrapperImpl(Object obj) {
super(obj);
}

//所有bean信息被转为CachedIntrospectionResults对象,缓存起来
//每个对象内保存了一个ConcurrentHashMap,缓存所有Class自省的结果
//lazy-init,调用Bean信息时才初始化
@Nullable
private CachedIntrospectionResults cachedIntrospectionResults;
}

Bean信息的存储:CachedIntrospectionResults

所有BeanWrapper包装的Bean信息都会被转成一个CachedIntrospectionResults对象进行存储:

  1. CachedIntrospectionResults对象中通过一个ConcurrentHashMap缓存了所有Class自省的结果

    Spring的自省机制:java.beans API对反射进行了封装,方便访问Bean property

  2. CachedIntrospectionResults对象中保存了BeanWrapper保证BeanBeanInfoPropertyDescriptorTypeDescriptor,这些信息都是Bean自省的结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class CachedIntrospectionResults {
//...

//存储所有Class自省的结果
static final ConcurrentMap<Class<?>, CachedIntrospectionResults> strongClassCache = new ConcurrentHashMap(64);


private final BeanInfo beanInfo;

private final Map<String, PropertyDescriptor> propertyDescriptorCache;

private final ConcurrentMap<PropertyDescriptor, TypeDescriptor> typeDescriptorCache;

//...
}

CachedIntrospectionResultsBeanWrapper中是lazy-init的,在用户真正去调用Bean相关信息时才会创建CachedIntrospectionResults

-------------本文结束感谢您的阅读-------------

本文标题:org.springframework.beans.BeanWrapper接口

文章作者:DragonBaby308

发布时间:2019年09月29日 - 20:39

最后更新:2019年09月29日 - 20:44

原始链接:http://www.dragonbaby308.com/org-springframework-beans-BeanWrapper/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

急事可以使用右下角的DaoVoice,我绑定了微信会立即回复,否则还是推荐Valine留言喔( ఠൠఠ )ノ
0%