Bean的生命周期&构建流程源码剖析

Bean的生命周期&构建流程源码剖析

  • 目录
    • 概述
    • 实现思路分析
      • ioc容器启动主线源码剖析
      • 容器的启动流程
      • 相关工具如下:
    • 分析:
  • 小结:
  • 参考资料和推荐阅读

LD is tigger forever,CG are not brothers forever, throw the pot and shine forever.
Modesty is not false, solid is not naive, treacherous but not deceitful, stay with good people, and stay away from poor people.
talk is cheap, show others the code,Keep progress,make a better result.
Survive during the day and develop at night。

目录

概述

Bean的生命周期&构建流程源码剖析,
ioc容器启动主线源码剖析。

实现思路分析

ioc容器启动主线源码剖析

Bean的生命周期&构建流程源码剖析_第1张图片

1.创建ClassPathXmlApplicationContext时需要指定xml文件的路径作为参数,尽管我们在创建时只指定了一个,但其实可以同时指定多个。
2.Spring容器有父子容器的概念,通过HierarchicalBeanFactory接口定义了具有层级关系的容器体系。而在抽象实现类AbstractApplicationContext类的内部,有一个表示父容器的成员变量
重载函数的第三个参数即表示要创建的ClassPathXmlApplicationContext的父容器,不过这里只需要设置为null。关于Spring的父子容器,还有一些独特的访问规则,子容器可以访问父容器中的Bean,父容器不可以访问子容器中的Bean。

//设置父容器
super(parent);
//设置xml文件的路径参数
setConfigLocations(configLocations);
if (refresh) { //默认为true
    //启动Spring容器
    refresh();
}

refresh()是定义在AbstractApplicationContext类中的模板方法,定义了容器启动的基本流程,并留下钩子方法供子类进行扩展。
启动容器的方法之所以用refresh(刷新)来命名,是为了形象的表达容器可以被重启这层含义。为了防止并发环境下多个线程同时启动IOC容器,整个过程使用同步代码块来进行同步。容器的启动从方法内容上来看并不复杂,流程也十分清晰,从方法名上大概就可以猜到每一步做了什么。

容器的启动流程

在这里插入代码片

Bean的生命周期&构建流程源码剖析_第2张图片
进去一探究竟
首先记录了容器的启动时间和对容器的状态进行了标记。之后来到了容器为用户提供的第一个扩展点:
这是一个默认空实现的钩子方法,用户在自定义IOC容器时可以重写,完成一些环境变量属性的初始化工作。

getEnvironment().validateRequiredProperties();

如果必须的环境变量信息不存在,则会抛出异常
结合前面的钩子initPropertySources(),用户在自定义IOC容器时可以完成一些个性化需求,比如要求容器在启动时必须从环境变量中加载某属性值,若该属性值不存在则启动失败。重写initPropertySources()如下

相关工具如下:

分析:

小结:

主要讲述了一些Bean的生命周期&构建流程源码剖析, 里面有许多不足,请大家指正~

参考资料和推荐阅读

1.链接: 参考资料.

你可能感兴趣的:(mvc)