这里现已ClassPathXmlApplicationContext为例
1  | /*  | 
初始化一个 ClassPathXmlApplicationContext上下文对象
1  | 
  | 
准备开始刷新应用程序
1  | 
  | 
环境初始化
1  | public AbstractEnvironment() {  | 
获取刷新好bean的beanfactory
1  | ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();  | 
classPathxml的bean信息加载
1  | protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {  | 
准备初始化完成 beanfactory的 额外设置
1  | 
  | 
增强beanfactory,
这是给子类的一个模板方法,如果子类对前面那一步对工厂设置不满义,可以在这一步进行工厂增强
1  | postProcessBeanFactory(beanFactory);  | 
注册其他所有的bean信息和调用beanfactory的后置处理
对beanfactory设置完成后,就需要调用 beanfactoryPostProcessors这些后置处理器对工厂进行进一步处理
或者增强
1  | invokeBeanFactoryPostProcessors(beanFactory);  | 
注册所有的beanpostprocessor
1  | public static void registerBeanPostProcessors(  | 
初始化注册消息源
1  | 
  | 
初始化事件发布器
1  | protected void initApplicationEventMulticaster() {  | 
初始化特定上下文子类中的其他特殊bean。
这个是spring提供出来的模板方法
1  | protected void onRefresh() throws BeansException {  | 
检查侦听器bean并注册它们。
1  | //添加实现ApplicationListener作为侦听器的bean。不影响其他侦听器,这些侦听器可以在不作为bean的情况下添加。  | 
实例化所有剩余的(非延迟初始化)单例。
1  | 
  | 
发布相应事件。
结束所有 非懒加载的bean的实例化,DI,aop,此时的应用程序上下文已经达到一个可用状态了
1  | 
  | 
ConfigurationClassPostProcessor注册bean信息
—–只有当存在配置类的时候,这个处理器才有用—–
如果你配置了注解驱动的话,就会有这么一个通过注解配置类加载bean定义信息的beandefinitionResgisterPostProcessor
1  | 
  | 
bean的产生
1  | 
  | 
bean的createBean方法
1  | protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)  | 
Bean 字段(属性)设置
populateBean(beanName, mbd, instanceWrapper)
1  | 
  | 
DI
1  | 
  | 
注解自动注入需要用到的 后置处理器
AutowiredAnnotationBeanPostProcessor
总结:
里面大量用到 模板方法的设计,父类抽象算法,子类提供实现
里面的逻辑功能处理 ,也满足所有的设计原则
(单一职责(什么类该干什么,不该干什么分的清清楚楚),
开闭原则(aware,postProcessor 等这些抽象接口,进行自定义实现,spring回调来进行扩展)
里氏替换(子类的实现,绝不改变 父类后者接口 方法定义的含义,可以透明替换实现)
依赖倒置(依赖的都是抽象或者接口(但不是顶级) )
接口隔离原则(每种顶级接口它的作用都是单一的,非常明确 )
迪米特法则( 里面没有任何类的任何地方是跟陌生人打交道的 )
)
(spring作者可能是设计原则的强迫症)
- 本文作者: 忘忧症
 - 本文链接: https://NepenthesZGW.github.io/2020/06/05/framework/Spring/Spring流程/
 - 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!
 
		