spring的一切神奇之处都在于BeanFactory,所有bean的实例构造都委托给了BeanFactory,正是因为这样,BeanFactory才能根据各种形式的BeanDefinition对构造之后的实例做各种处理:各种生命周期回调,其中一个是BeanPostProcessor,通过BeanPostProcessor实现了@Autowired,体现了依赖注入。通过BeanPostProcessor和代理实现了aop,事务等的处理。
本文的目的是分析BeanFactory的实现机制,以及总结最全的bean处理流程。
BeanFactory类层次.png BeanFactory继承层次.png uml.png1, BeanFactory的实现机制
根据继承层次自上而下
1.1 SimpleAliasRegistry
SimpleAliasRegistry.png基于Map实现注册删除查找别名的能力。
1.2 DefaultSingletonBeanRegistry
DefaultSingletonBeanRegistry.png记录构建完的单例bean及其依赖关系
registerSingleton.png getSingleton-1.pngReturn 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.png1.3 FactoryBeanRegistrySupport
缓存FactoryBean及其创建的bean实例
状态.png FactoryBean-1.png FactoryBean-2.png1.4 AbstractBeanFactory
状态-1.png 状态-2.pngTypeConverter:依赖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.png1.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生命周期.png1.6 DefaultListableBeanFactory
状态.png主要提供注册查找BeanDefinition的能力,每个BeanDefinition表示一个bean的各种元数据信息,可以来自注解,xml等数据源
BeanDefinition.pngspring最最核心的bean容器BeanFactory分析完了!!!
网友评论