美文网首页
spring-beans

spring-beans

作者: 码农崛起 | 来源:发表于2018-05-07 22:06 被阅读0次

    spring的一切神奇之处都在于BeanFactory,所有bean的实例构造都委托给了BeanFactory,正是因为这样,BeanFactory才能根据各种形式的BeanDefinition对构造之后的实例做各种处理:各种生命周期回调,其中一个是BeanPostProcessor,通过BeanPostProcessor实现了@Autowired,体现了依赖注入。通过BeanPostProcessor和代理实现了aop,事务等的处理。

    本文的目的是分析BeanFactory的实现机制,以及总结最全的bean处理流程。

    BeanFactory类层次.png BeanFactory继承层次.png uml.png

    1, BeanFactory的实现机制
    根据继承层次自上而下

    1.1 SimpleAliasRegistry

    SimpleAliasRegistry.png

    基于Map实现注册删除查找别名的能力。

    1.2 DefaultSingletonBeanRegistry

    DefaultSingletonBeanRegistry.png

    记录构建完的单例bean及其依赖关系

    registerSingleton.png getSingleton-1.png

    Return the (raw) singleton object registered under the given name. Only checks already instantiated singletons; does not return an Object for singleton bean definitions which have not been instantiated yet. The main purpose of this method is to access manually registered singletons (see registerSingleton). Can also be used to access a singleton defined by a bean definition that already been created, in a raw fashion.

    getSingleton-2.png

    如果指定bean还没构建,使用指定的ObjectFactory构建,然后加入注册表,不会执行任何生命周期事件。

    registerDependentBean.png isDependent.png destroyBean.png

    1.3 FactoryBeanRegistrySupport

    缓存FactoryBean及其创建的bean实例

    状态.png FactoryBean-1.png FactoryBean-2.png

    1.4 AbstractBeanFactory

    状态-1.png 状态-2.png

    TypeConverter:依赖PropertyEditorRegistry和ConversionService实现类型转换
    PropertyEditorRegistry:指定类型或指定类型的特定属性路径关联的PropertyEditor
    PropertyEditor:setValue/getValue,getAsText/setAsText实现字符串和Object之间互相转换。
    此三者主要用于构造bean时从字符串转换属性值。

    BeanFactory中最重要的是注册的BeanPostProcessor,拦截每一个bean的创建和销毁,实现很多重要的功能。

    bean创建过程:

    检查是否单例bean.png

    先检查是否在单例缓存里

    parent.png

    当前BeanFactory里没有指定bean的定义,递归检查parent。

    getMergedLocalBeanDefinition.png 递归初始化依赖.png

    如果是子bean,先跟parent合并属性,然后检查依赖,先递归初始化依赖

    create-1.png 自定义scope.png

    创建bean实例

    类型转换.png convert-0.png convert-1.png convert-2.png

    先从TypeConvert内部的propertyEditorRegistry查找requiredType对应的PropertyEditor,如果为空就尝试使用TypeConvert内部的ConversionService。
    PropertyEditor不为空,如果value非字符串,setValue/getValue实现Object转Object,如果是字符串 setAsText/getValue实现字符串转Object。

    销毁bean实例

    destory-1.png destory-2.png

    1.5 AbstractAutowireCapableBeanFactory


    BeanPostProcessor.png DestructionAwareBeanPostProcessor.png InstantiationAwareBeanPostProcessor.png

    以上三个接口在每个bean构造,初始化,销毁过程中都会回调,用于实现aop动态代理,@Autowired注解等。

    创建bean:

    createBean.png resolveBeforeInstantiation.png applyBeanPostProcessorsBeforeInstantiation.png applyBeanPostProcessorsAfterInitialization.png

    执行InstantiationAwareBeanPostProcessor回调,可以返回代理bean,用于实现aop等

    填充bean:

    populateBean-1.png

    执行实例化之后的回调,然后根据byName还是byType自动装配,查找匹配的bean

    populateBean-2.png

    填充自动装配的属性之前,执行回调,然后通过反射设置字段引用。

    初始化bean:

    initializeBean.png invokeAwareMethods.png applyBeanPostProcessorsBeforeInitialization.png invokeInitMethods.png applyBeanPostProcessorsAfterInitialization.png

    注册destory回调:

    registerDisposableBeanIfNecessary.png bean生命周期.png

    1.6 DefaultListableBeanFactory

    状态.png

    主要提供注册查找BeanDefinition的能力,每个BeanDefinition表示一个bean的各种元数据信息,可以来自注解,xml等数据源

    BeanDefinition.png

    spring最最核心的bean容器BeanFactory分析完了!!!

    相关文章

      网友评论

          本文标题:spring-beans

          本文链接:https://www.haomeiwen.com/subject/hgvplftx.html