这里现已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 许可协议。转载请注明出处!