十分钟快速理解 Spring IoC 控制反转(上)

527 阅读4分钟

这是我参与8月更文挑战的第15天,活动详情查看:8月更文挑战

Spring IOC控制反转

控制反转(IoC,Inversion of Control),是一个概念,是一种思想。指将传统上由程序代 码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理。控制反转就是对对象控制权的转移,从程序代码本身反转到了外部容器。通过容器实现对象的装配和管理。

IoC 是一个概念,是一种思想,其实现方式多种多样。当前比较流行的实现方式是依赖注入。应用广泛。

依赖:classA 类中含有 classB 的实例,在 classA 中调用 classB 的方法完成功能,即 classA 对 classB 有依赖。

IOC的实现

● 依赖查找:DL ( Dependency Lookup ), 容器提供回调接口和上下文环境给组件。

● 依赖注入:DI (Dependency Injection),程序代码不做定位查询,这些工作由容器自 行完成。

依赖注入 DI 是指程序运行过程中,若需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部容器,由外部容器创建后传递给程序。

Spring的依赖注入对调用者与被调用者几乎没有任何要求,完全支持 POJO 之间依赖关系的管理。

依赖注入是目前最优秀的解耦方式。依赖注入让 Spring 的 Bean 之间以配置文件的方式 组织在一起,而不是以硬编码的方式耦合在一起的。

Spring框架使用依赖注入(DI)实现IoC。

Spring容器是一个超级大工厂,负责创建、管理所有的Java对象,这些Java对象被称为Bean。Spring容器管理着容器中Bean之间的依赖关系,Spring使用“依赖注入”的方式来管理Bean之间的依赖关系。使用IoC实现对象之间的解耦和。

开发工具准备

开发工具:idea2017以上

依赖管理:maven3以上

jdk:1.8以上

需要设置maven本机仓库:

第一个Spring程序

在普通三层架构的基础上,将程序修改为 Spring框架程序

举例:01-primay

导入 Jar 包

首先,导入 Spring 程序开发的四个基本 jar 包。

日志:commons.apache.org/proper/comm…

其次,导入日志相关的 Jar 包。

commons.logging.jar 该文件只是日志记录的实现规范,并没有具体的实现(相当于日志操作的接口定义)。

这里日志的实现使用 log4j,故还需要 log4j.jar。

最后,导入 JUnit 测试 Jar 包 junit-4.9.jar。

Spring 基本编程,共需 7 个 Jar 包即可。

定义接口与实体类

创建Spring配置文件

Spring配置文件的文件名可以随意,但Spring建议的名称为applicationContext.xml。文件约束在%SPRING_HOME%\docs\spring-framework-reference\html\xsd-configuration.html文件中。

注意,Spring 配置文件中使用的约束文件为 xsd 文件。若 Eclipse 中没有自动提示功能,则需要将约束要查找的域名地址指向本地的 xsd 文件。相应的 xsd 文件在 Spring 框架解压目录下的 schema 目录的相应子目录中。

约束文件:xsd(xml schema definition) xml 文档结构定义。

作用:验证 xml 文档的逻辑结构是否正确。

● 定义一个 xml 文档中都有什么元素

● 定义一个 xml 文档中都有什么属性

● 定义一个 xml 文档中元素可以有哪些子元素,以及元素的顺序。

● 定义一个 xml 文档中元素和属性的数据类型。

这里需要的是 spring-beans.xsd 约束文件,故需要在 beans 子目录中查找相应版本的约束文件。

< bean />:用于定义一个实例对象。一个实例对应一个 bean元素。

id:该属性是 Bean 实例的唯一标识,程序通过 id 属性访问 Bean,Bean 与 Bean 间的依赖关系也是通过 id 属性关联的。

class:指定该 Bean 所属的类,注意这里只能是类,不能是接口。

配置不能联网,本机的约束文件

先拷贝约束文件的 url 地址, 然后点击 Eclipse 的 windows 菜单下面的 Perferences

定义测试类

容器接口和实现类

1、ApplicationContext 接口(容器)

ApplicationContext 用于加载 Spring 的配置文件,在程序中充当“容器”的角色。其实现类有两个。

通过 Ctrl +T 查看:

A、配置文件在类路径下

若 Spring 配置文件存放在项目的类路径下,则使用 ClassPathXmlApplicationContext 实现类进行加载。

B、 配置文件在本地目录中

若 Spring 配置文件存放在本地磁盘目录中,则使用 FileSystemXmlApplicationContext 实现类进行加载。

C、 配置文件在项目根路径下

若 Spring 配置文件存放在项目的根路径下,同样使用 FileSystemXmlApplicationContext 实现类进行加载。

下面是存放在项目根路径下的情况,该配置文件与 src 目录同级,而非在 src 中。

D、ApplicationContext 容器中对象的装配时机

ApplicationContext 容器,会在容器对象初始化时,将其中的所有对象一次性全部装配好。以后代码中若要使用到这些对象,只需从内存中直接获取即可。执行效率较高。但占用内存。