Spring-Bean包分析

我的个人网址: zidot.cn

Spring Beans

包概述

spring beans 包主要用来处理Spring Bean,包括Bean的容器定义、Bean的生命周期、Bean的初始化、Bean配置加载等。spring 提供了三种Bean的配置方式,包括xml配置、Java config配置、groovy配置。

结构图

spring-beans 下主要包含annotation、factory、propertyeditors、support包。最主要的是factory、propertyeditors包了。我精心整理了包下关键的接口或类,并绘制了类图。如下图

spring-beans 包结构:

其中有几个核心的类,如下:

  • BeanInfoFactory
  • ExtendedBeanInfo
  • BeanWrapper
BeanInfoFactory

BeanInfoFactory 是BeanInfo 工厂类,用来生成指定的Bean Class的描述类BeanInfo。BeanInfoFactory的实现类是ExtendedBeanInfoFactory,其中getBeanInfo方法放回的其实是ExtendedBeanInfo实例。有一点要注意ExtendedBeanInfoFactory 中的getBeanInfo 每次返回的是新的BeanInfo对象,内部没有作缓存。

那BeanInfo是用来做什么的呢。其实BeanInfo,是在java.beans包下,是java标准的一个接口。用来描述Iava Bean的一些信息。我们可以通过java 提供的 Introspector#getBeanInfo 方法获取指定类的的BeanInfo实例。

ExtendedBeanInfo

ExtendedBeanInfo 采用了代理模式,继承了BeanInfo接口,持有一个BeanInfo实例的引用。

BeanWrapper

BeanWrapper 是Spring Bean的包装类,通过它我们可以非常方便的访问Bean的属性、获取某个属性的值或给某个属性赋值。Spring 还提供了强大的类型转换机制,在给Bean属性赋值时,进行对应的类型转换工作,这个转换是由TypeConverter来定义并由AbstractNestablePropertyAccessor类实现。

对Bean属性的访问、赋值是通过PropertyAccessor来实现的。PropertyAccessor 支持嵌套的属性访问和数组访问,我们可以用路径来表式一个属性,如:“foo.bar”,“person.addresses[0]”。这种嵌套的属性路径有可能出现父一级为null的情况,这种情况下spring为我们提供了两种处理方式,一:如果父一级为null,spring 帮我们自动创建一个父级对象;二:抛出NullValueInNestedPathException 异常。spring 把这种特性叫 auto-grow。可以通过ConfigurablePropertyAccessor#setAutoGrowNestedPaths方法设置是否开启,默认关闭。

在BeanWrapper接口中还有一个方法跟 auto-grow有关,它就是BeanWrapper#setAutoGrowCollectionLimit 方法。它是用来控制auto-grow开启下,如果父一级是数组或集合的话,auto-grow 对生成的数组元素个数的限制,默认是没有限制的。如,我通过 “person.addresses[1]” 来给person对象中的addresses数组种的元素赋值,在auto-grow开启的情况下如果访问的下表元素不存在spring会帮我们创建一个。假如数组下标值很大,spring就或创建一个很大的数组来容纳这个元素。setAutoGrowCollectionLimit方法就是用来控制这个的,我们可以控制要创建的元素个数不能超过某个值。

TypeConverter类型转换具体的实现是通过 ConversionService,ConversionService是在Spring-Core中定义一个服务接口。Spring为我们提供了很好的扩展支持。如果进行扩展,我会在其他地方写到。

factory 结构图

前面提到了spring 提供了三种Bean的配置方式,包括xml配置、Java config配置、groovy配置。这么强大的能力都是在factory包中实现的。由于内容比较多各个配置的代码是如何实现的,我会在其他的章节详细讲解。下边主要介绍BeanFactory、Bean声明周期相关的一些类。

spring-beans 子包factory包结构:图中颜色部分一般用在Bean上。

其中有几个核心的类,如下:

  • BeanFacotry
  • Aware
  • FactoryBean
BeanFactory

BeanFactory 就是我们经常讲的Bean 容器。BeanFactory为我们提供了几个常见的获取Bean的方法,如通过名字、类型、别名来获取Bean。BeanFactory 是支持父子容器的。提到父子容器,我们首先想到的大概就是Spring MVC了吧。

Aware

Aware 接口只是一个标识接口。factory下有BeanClassLoaderAware、BeanFactoryAware、BeanNameAware。比较常用的是BeanFactoryAware,用来注入BeanFacotry。

FactoryBean

FactoryBean是一种特殊接口,我们可以叫他工厂Bean。它首先是一个Spring Bean,然后是一个工厂。那么这个工厂用来做什么的呢,它是用来生成Spring Bean的。如果一个Bean 实现了该接口,就不能想普通的Bean一样来使用。我们通过名字获取到的Bean实例都是通过工厂来生成的。如果我要获取FactoryBean的实例怎么办呢,我们可以在BeanName请加上“&”符号。例如:BeanFactory.getBean("&delegator");

DisposableBean
InitializingBean
SmartInitializingSingleton

可以在Bean周期中的回调接口,通过实现某个接口可以参与到Bean的整个过程中来,从Bean的创建到销毁。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
dynamic-datasource-spring-boot-starter 是一个基于 Spring Boot 的动态数据源库。它提供了在运行时动态切换数据源、动态创建数据源以及多租户的支持。 对于 dynamic-datasource-spring-boot-starter 的源码分析,可以从以下几个方面进行思考: 1. 数据源的自动装配:源码中可能会使用 Spring Boot 的自动配置功能,通过扫描配置类或者注解的方式,自动将数据源相关的类和 bean 注入到应用程序中。 2. 动态切换数据源的实现:动态切换数据源是 dynamic-datasource-spring-boot-starter 的核心功能之一。源码中可能会涉及到 AOP、动态代理等技术,通过拦截器或者代理的方式,在运行时根据特定条件切换数据源。 3. 动态创建数据源的实现:动态-datasource-spring-boot-starter 提供了在运行时动态创建数据源的功能。源码中可能会含一些工厂类或者构建者模式的实现,根据配置信息动态创建数据源实例。 4. 多租户支持的实现:多租户是指一个系统可以同时服务于多个不同的客户或租户。dynamic-datasource-spring-boot-starter 也提供了对多租户的支持。源码中可能会含一些多租户相关的类和逻辑,如解析请求或者从配置文件中获取租户信息等。 总结来说,dynamic-datasource-spring-boot-starter 源码分析涉及到数据源的自动装配、动态切换数据源的实现、动态创建数据源和多租户支持等方面的内容。可以通过阅读源码来深入了解其实现原理和技术细节,从而更好地使用和定制该库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值