再聊 Spring IOC

我们一般说Spring都是比较笼统的直接代指SpringFramework,本篇文章主要就回顾熟悉下Spring的核心模块 Spring IOC。

Spring IOC

spring ioc是spring core的核心概念,也是入门spring的核心知识点。

IoC 理论

IOC 全称为 Inversion of Control,翻译为控制反转,spring实现控制反转的方式为Dependency Injection,简称 DI ,即依赖注入。

Spring Ioc 其实就是由 spring 容器用来管理对象的生命周期及对象之间的关系。

Spring Ioc 简单概括就是做了这么几件事:

  • 加载资源,扫描读取需要初始化的Bean
  • 读取初始化Bean
  • 注入Bean对象之间的依赖
  • 统一管理Bean生命周期

Spring加载Bean的方式如下:

  • 通过xml标签定义的方式加载Bean
  • 通过ComponentScan注解扫描相关的包文件
  • 通过JavaConfig的形式定义需要加载的Bean

    目前Spring已经不推荐使用xml方式加载,现在流行的SpringBoot基本都是基于注解和JavaConfig的形式进行配置以及加载,大势所趋哦!

Resource&ResourceLoader 资源定义及加载

Resource

让我们先来了解一下Spring对资源抽象相关的类,下图是spring对于资源进行抽象的类结构图:

org.springframework.core.io.Resource 为 Spring 框架所有资源的抽象和访问接口,它继承自 org.springframework.core.io.InputStreamSource接口。作为所有资源的统一抽象,Resource 定义了一些通用的方法,由子类 AbstractResource 提供统一的默认实现,如果我们要自己去实现一个Resource的话继承一个 AbstractResource 是个明智的选择。

ResourceLoader

有抽象的资源的资源就有对应的资源加载器,spring做的很完善资源的定义和资源的加载是分开的,ResourceLoader 的主要作用就是通过给定的资源路径返回对应的Resource

ResourceLoader也提供了默认实现DefaultResourceLoader,并且在该类的 #getResource() 方法中已经进行了较为完整的实现。

还有一点可以看到 ResourcePatternResolver 这个接口是spring定义的批量文件加载器,其实现类 org.springframework.core.io.support.PathMatchingResourcePatternResolver 可支持根据路径匹配模式返回多个 Resource 实例。这个便是支持 "classpath*:" 方式的重要部分哦。

BeanDefinition&BeanDefinitionReader Bean的定义、装载

BeanDefinitionReader

BeanDefinitionReader ,主要定义资源文件读取并转换为 BeanDefinition 的各个功能。

XmlBeanDefinitionReader 是BeanDefinitionReader的一种实现,其中#loadBeanDefinitions()方法是加载资源的真正实现,方法中调用#doLoadBeanDefinitions()方法为实际加载和注册。

下图是关于整个bean的加载过程,想要更清楚理解建议配合源码食用。