Spring的基本概念和IOC流程的简述

扑街前言:spring 现在算是针对java语言的企业级业务的基本框架了,现在中高级面试基本都要问spring,其中的区别就是深度问题,我后面的文章也是对于spring 源码的分析,不再针对初级内容做解析了,主要就是简单说下spring 的基本概念,然后就是说IOC 容器部分的内容了,如果不知道spring 基本使用的初学者建议还是要先看看基础的相关文章。

Spring的设计理念

spring 是面向bean的编程,bean 在spring 中才是真正的主角。bean 在spring 中的作用就相当于是object 对于oop 的意义一样。spring 中没有bean 也就没有spring 存在的意义。spring 提供了IOC 容器通过配置文件或者注解的方式来管理对象之间的依赖关系。

控制反转也就是IOC,是面向对象编程中的一种设计原则,可以用来降低代码之间的耦合。其中常见的方式叫做依赖注入,还有一种方式叫依赖查找。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将所有依赖的对象的引用传递给它。


核心组件介绍

Bean

bean 组件定义在spring 的org.springframework.beans 包下,解决了一下几个问题:

  • bean 的定义
  • bean 的创建
  • bean 的解析

spring bean 的创建是典型的工厂模式,它的顶级接口是beanFactory。

image-20220421144617485

beanFactory 有三个子类:ListableBeanFactory、HierarchicalBeanFactory 和AutowireCapableBeanFactory。其目的就是为了区分spring 内部对象处理和转化的数据限制。

但是从图片中可以发现最终默认的实现类是DefaultListableBeanFactory,它实现了所有的接口。

Bean 定义:BeanDefinition

这里的beanDefinition 就是我们所有说的spring 的bean,我们自己定义的各个bean 其实会转换成一个beanDefinition 存在于spring 的beanFactory 中。

从DefaultListableBeanFactory 的代码中其实可以看到beanDefinition 是以一个map 集合的形式存入的。

public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {
    
    private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
}

beanDefinition 中保存了我们的bean 信息,比如这个bean 指向的是哪个类、是否是单例的、是否懒加载、这个bean 依赖了哪些bean 等等。

Context组件

context 在Spring的org.springframework.context包下。

context 模块构建于core 和beans 模块基础之上,提供了一种类似于JNDI注册器的框架式的对象访问方法。context 模块继承了beans 的特性,为spring 核心提供了大量扩展,添加了对国际化(例如资源绑定)、事件传播、资源加载和对context 的透明创建的支持。

applicationContext 就是context 的顶级父类。

image-20220421151744844

applicationContext 总的来说必须要完成一下几件事:

  • 标识一个应该环境
  • 利用beanFactory 创建bean 对象
  • 保存对象关系表
  • 能够捕获各种事件

IOC流程图简述

基本上说到spring 那么必定要说的两个东西,一是IOC、二是AOP。

image-20220421154643634

从图中可以看到的就是IOC 的整个流程,并且还能看到AOP 的具体调用时机,以及bean 的生命周期。其实面试也就是这几个问题,IOC 的流程、AOP 的调用、bean 的生命周期、循环依赖的产生和处理。这些问题在这个图中都可以看出来,具体后面再说。

我们这里先说怎么去跟IOC的整个流程:

  1. 首选一定是创建BeanFactory 容器;
  2. 然后要解析配置信息,并将配置信息封装成BeanDefinition 对象,再将其存入BeanFactory 中;
  3. 然后BeanFactoryPostProcessor Bean工厂的后置处理器的执行;
  4. 再然后要对于BeanPostProcessor Bean 的后置处理的初始化,注意这里不要和上一步搞混了,一个工厂后置处理器,一个是Bean 后置处理器;
  5. 然后实例化Bean 对象,这里的对象信息来源就是BeanFactory 中的BeanDefinition 对象,注意这里就只是单纯的实例化,没有参数赋值的那种;
  6. 然后才是初始化过程,具体流程源码分析见;
  7. 最后就能得到一个完整的对象放入单例池中,这样IOC 容器的构建才是结束了。

总结

spring 是一个非常庞大的体系,它的源码相较于其它框架来说,算是复杂程度较高的那种。我对于阅读它的源码心得,就是第一次读非常的糟心,第二次依旧,不管是写测试类debug 一步一步跟也好,还是看有注释的代码版本也好,那种感觉都非常的不好,但是当我静下心来慢慢来,不知道第几遍开始的时候,我才真正的感受到了它的优秀,阅读这类代码不能放弃,首先要坚持到整个流程走完,然后再去看每个重点步骤做了什么,最后才是连贯看整体,至于怎么知道什么是整个流程、哪一步是重点,我上面不是已经说了嘛🤞。


附录Spring 源码分析系列文章

时间文章
2022-03-09Spring的基本概念和IOC流程的简述
2022-03-11IOC流程解析-BeanFactory的创建
2022-03-14IOC流程解析-BeanFactoyPostProcessor和BeanPostProcessor
2022-03-15
2022-03-17
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值