定义

让调用类对某一接口的具体实现类的依赖关系由第三方注入,以移除调用类对某一接口实现类的依赖

IoC类型
  • 构造函数注入
  • 属性注入
容器完成依赖关系的注入

本质上是容器把类的初始化和装配等底层工作完成,减少程序员开发的工作量,从而专注业务逻辑开发工作
Spring IoC容器通过配置文件或注解描述类与类之间的依赖关系,自动完成类的初始化和依赖注入工作。

启动IoC容器

new XmlBeanFactory()等方式即可启动容器。在容器启动时,Spring根据配置文件的描述信息,自动实例化Bean并完成依赖关系的装配,从容器中即可返回准备就绪的Bean实例

资源加载

Spring提供了多种资源加载Resource的实现类来满足不同的加载需求,还有一个强大的加载机制,可以不显示指定具体的资源加载类而通过资源地址的特殊标识就可以访问相应的资源,支持classpath: file: http:// ftp:// 和没有前缀,通过资源地址前缀识别不同的资源类型然后自动选择合适的Resource实现类来加载资源

  • classpath: 从类路径中加载资源,classpath:和classpath:/是等价的
  • file: 使用UrlResource从文件系统目录中加载资源,可采用绝对或相对路径
  • http:// 使用UrlResource从Web服务器中加载资源
  • ftp:// 使用UrlResource从FTP服务器中加载资源
  • 没有前缀: 根据ApplicationContext的具体实现类采用对应类型的Resource

其中classpath:和classpath*:的区别:
假设有多个JAR包或文件系统类路径都拥有一个相同的包名com.yy,“classpath:”只会从第一个加载的com.yy包的类路径下查找,而“classpath*:”会扫描所有这些JAR包及类路径下出现的com.yy类路径。
Ant风格的资源地址支持3中通配符。
?:匹配文件名中 的一个字符
*:匹配文件名中的任意字符
**:匹配多层路径

资源加载器

Spring定义了一套资源加载的接口,并提供了实现类

spring清理资源_配置文件

ResourceLoader接口的getResource方法仅支持带资源类型前缀的表达式,不支持Ant风格的资源路径表达式
ResourcePatternResolver扩展ResourceLoader接口,定义了一个新的方法getResources,该方法支持带资源类型前缀及Ant风格的资源路径表达式

用Resource操作文件时,如果资源配置文件在项目发布时会被打包到JAR中,那么不能使用getFile()方法,否则抛出FileNotFoundException异常,但可以使用getInputStream()方法读取,项目开发时,资源文件是放在文件夹下,getFile方法可以获取,但是项目发布后,资源文件被打包到JAR文件中,getFile就无法读取,尽量以流的方式读取,避免因为环境不同造成额问题

资源装载器装载资源的步骤为:

  • 先实例化资源装载器,一般选择功能强大的PathMatchingResourcePatternResolver,实例化PathMatchingResourcePatternResolver的时候,如果不加参数,默认采用DefaultResourceLoader的实例对象作为它的ResourceLoader类型的实例域
  • 然后调用getResource或者getResources方法加载资源配置文件,加载的时候最终会调用实例域ResourceLoader的getResource方法来生成Resource
  • 例如classpath类型的资源配置文件路径,ResourceLoader实例域的getResource方法内部根据判断就会直接new ClassPathResource(路径参数),然后返回这个对象

总结:PathMatchingResourcePatternResolver灵活地委托自己内部的ResourceLoader成员去加载资源配置文件,而ResourceLoader加载配置文件是通过生成对应资源对象并返回作为Resource的,也就是说,如果你要加载类路径下的某个配置文件,可以直接new ClassPathResource(路径参数)来直接加载就行,之所以使用资源加载器来加载资源,是为了以一种统一的方式去加载不同的资源(松耦合),资源加载器内部会对资源文件的路径前缀进行判断来选择正确、合适的Resource的实现类去访问并加载资源配置文件