spring-IOC源码详解

类结构图

                                            BeanFactory
                        
HierarchicalBeanFactory                 AutowireCapableBeanFactory                ListableBeanFactory
                                                                
ConfigurableBeanFactory                                

                                    ConfigurableListableBeanFactory                            
                                    
                                    
                                    ConfigurableListableBeanFactory
                                    
                                    
                                    
                                    DefaultListableBeanFactory
                                    
                                    
                                    
类继承描述

 BeanFactory 的子类为  HierarchicalBeanFactory AutowireCapableBeanFactory ListableBeanFactory 三个类
 

HierarchicalBeanFactory 的子类为 ConfigurableBeanFactory

BeanFactory -> HierarchicalBeanFactory -> ConfigurableBeanFactory -> ConfigurableListableBeanFactory -> DefaultListableBeanFactory

BeanFactory -> AutowireCapableBeanFactory -> ConfigurableListableBeanFactory -> DefaultListableBeanFactory

BeanFactory -> ListableBeanFactory -> ConfigurableListableBeanFactory -> DefaultListableBeanFactory


BeanFactory 作为spring容器的基类 提供的基本的获取bean的接口

HierarchicalBeanFactory 在 BeanFactory 的基础上提供获取父容器的接口

AutowireCapableBeanFactory 在 BeanFactory 的基础上提供bean自动装配的功能 (三种方式 by_type by_name by_construct)

ListableBeanFactory 在 BeanFactory 的基础上提供获取容器数据的功能即可以拿到容器中所有的beanName 然后可以根据beanName获取bean

ConfigurableBeanFactory 为beanFactory提供表达式解析类型转换的功能以及获取单例的bean的注册机制 以及根据 beanName获取BeanDefinition


ConfigurableListableBeanFactory 作为继承了上面所有的容器 提供给子类继承


doCreate -> beanInstance -> beanInitization


doCreate 

第一步 检查该类的beanDefinition是否已经全部解析完成 如果已经完成 实例化前置处理(一般情况是进行代理判断 如果由代理 则生成代理类直接返回 并且进行applyBeanPostProcessorsAfterInitialization处理)
第二步(实例化)  检查缓存工厂中是否存在,如果已有则直接返回 BeanWrapper 
第三步 创建 BeanWrapper(包裹实例 用于后面的 propetyValue设置) 中间会有自动注入
第四步    如果有 MergedBeanDefinitionPostProcessor 则对 beanDefinion 进行处理
第五步 如果该bean为单例,且允许循环引用,并且还在创建中 那么将其自动构建一个ObjectFactoruy中添加到SingleFactory中 以便循环引用
第六步 判断是否已经完全处理好,如果处理好则进行实例化之后的处理(实例化后置处理)
第七步 如果 对bean进行填充 自动装配  注入依赖类 以及设置属性
第八步 检查依赖是否已经完全实现,如果依赖已经实现,那么对将要注入的属性值进行一些操作(在工厂将给定的属性值应用到给定的bean之前,对其进行后处理。允许检查是否所有依赖项都已被安全化,例如,基于bean属性设置器上的“必需”注释。还允许替换要应用的属性值,通常通过基于原始属性值创建新的可变属性值实例、添加或删除特定值来实现。默认实现按原样返回给定的pv)
第九步 再次检查依赖,如有异常则抛出
第十步 将上面处理过的PropertyValue属性注入到bean中

第十一步 进行初始化处理
    执行 invokeAwareMethods 将Aware的bean设置到bean
    执行 applyBeanPostProcessorsBeforeInitialization 进行初始化前的操作
    执行 初始化 invokeInitMethods 实质是执行 InitializingBean.afterPropertiesSet() 或者自定义 初始化方法 (一般为@PostConstruct定义的方法)
    执行 applyBeanPostProcessorsAfterInitialization  这一步使用  AbstractAutoProxyCreator
    
    AbstractAutoProxyCreator.postProcessAfterInitialization(@Nullable Object bean, String beanName) throws BeansException
    AbstractAutoProxyCreator.wrapIfNecessary(Object bean, String beanName, Object cacheKey)
    实现代理
    
第十二步 如果是DisposableBean 需要注册到注销管理器中 以便容器注销时调用

最后返回


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值