Spring 源码复习 03 IOC 个人笔记 03 bean初始化

前面完成了beanDefinition的初始化,注册,下面开始另一个核心的内容实现  bean初始化

十一、finishBeanFactoryInitialization: 初始化所有的singleton beans,不包括懒加载lazy-init的bean

           Spring在这个阶段,需要完成所有singletonBean的初始化

   1. 先初始化LoadTimeWeaverAware 类型的 Bean,一般用于织入第三方模块,在 class 文件载入 JVM 的时候动态织入,这里不展开说

  2.beanFactory.freezeConfiguration();  马上就要初始化bean了,此时需要冻结bean的解析,加载,注册

  3.beanFactory.preInstantiateSingletons();  实例化singletonBean

    只实例化非抽象的,单例的,非懒加载的bean   

4. 如果是factoryBean,需要在beanName前面增加 “&”

5. 历经漫长等待,终于到了getBean()方法,从BeanFactory 中获取一个 Bean

6.需要检查下是否已经创建过了

7.如果是普通 Bean 的话,直接返回 sharedInstance;如果是 FactoryBean 的话,返回它创建的那个实例对象

 8.检查beanDefinition是否存在,没有的话,就去父容器查询一下,看看有没有

9.先获取依赖关系,然后检查是否存在循环依赖关系,有的话,就需要抛出异常

10. 注册一下依赖关系 registerDependentBean(dep, beanName);

11.然后是核心逻辑,createBean

让BeanPostProcessor 在这一步有机会返回代理,而不是 bean 实例

12.   重头戏,创建 bean ,调用 Object beanInstance = doCreateBean(beanName, mbdToUse, args)

    12.1 如果不是factoryBean,就实例化 Bean;如果是factoryBean,就instanceWrapper.getWrappedInstance()

    12.2.继续看核心逻辑createBeanInstance

    12.3 校验一下这个类的访问权限

    12.4 采用工厂方法实例化,不熟悉这个概念的读者请看附录

    12.5 采用无参构造函数,还是构造函数依赖注入 来完成实例化

13. 核心逻辑 beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);

    

反射获取constructorToUse,然后BeanUtils.instantiateClass(constructorToUse); 根据这个构造函数实例化bean出来

14.实例化bean出来后,我们继续进行属性注入

14.1 通过名字找到所有属性值,如果是 bean 依赖,先初始化依赖的 bean。记录依赖关系

14.2 通过类型装配。复杂一些

15. initializeBean 属性注入完成后,这一步其实就是处理各种回调了。

16. 如果 bean 实现了 BeanNameAware、BeanClassLoaderAware 或 BeanFactoryAware 接口,回调

17.

  1. // 处理 bean 中定义的 init-method,

  2. // 或者如果 bean 实现了 InitializingBean 接口,调用 afterPropertiesSet() 方法

 

    

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值