JavaWeb开发(三)3.2 ——Spring IOC详解

一、控制反转(IoC)的概念

IOC (控制反转):简单说就是当我们使用对象调用一个方法或者类时,不再由我们主动去创建这个类的对象,控制权交给spring框架。复杂点说就是资源(组件)不再由使用资源双方进行管理,而是由不使用资源的第三方统一管理,这样带来的好处。第一,资源的集中管理,实现资源的可配置和易管理。第二,降低了使用资源双方的依赖程度,也就是我们说的耦合度。

DI (依赖注入):由spring框架主动创建被调用类的对象,然后把这个对象注入到我们自己的类中,使得我们可以直接使用它。

IoC 是 Inversion of Control 的简写,它是一种设计思想,是一个重要的面向对象编程法则,能够指导我们如何设计出松耦合、更优良的程序。 Spring 通过 IoC 容器来管理所有 Java 对象的实例化和初始化,控制对象与对象之间的依赖关系。我们将由 IoC 容器管理的 Java 对象称为 Spring Bean,它与使用关键字 new 创建的 Java 对象没有任何区别。

在传统的 Java 应用中,一个类想要调用另一个类中的属性或方法,通常会先在其代码中通过 new Object() 的方式将后者的对象创建出来,然后才能实现属性或方法的调用。为了方便理解和描述,我们可以将前者称为“调用者”,将后者称为“被调用者”。也就是说,调用者掌握着被调用者对象创建的控制权。

在 Spring 应用中,Java 对象创建的控制权是掌握在 IoC 容器手里的,其大致步骤如下:
(1)开发人员通过 XML 配置文件、注解、Java 配置类等方式,对 Java 对象进行定义,例如在 XML 配置文件中使用 标签、在 Java 类上使用 @Component 注解等。
(2)Spring 启动时,IoC 容器会自动根据对象定义,将这些对象创建并管理起来。这些被 IoC 容器创建并管理的对象被称为 Spring Bean。
(3)当我们想要使用某个 Bean 时,可以直接从 IoC 容器中获取(例如通过 ApplicationContext 的 getBean() 方法),而不需要手动通过代码(例如 new Obejct() 的方式)创建。

IoC 从思想层面上发生了“主从换位”的改变。原本调用者是主动的一方,它想要使用什么资源就会自己创建;但在 Spring 应用中,IoC 容器掌握着主动权,调用者则变成了被动的一方,被动的等待 IoC 容器创建它所需要的对象(Bean)。这个过程在职责层面发生了控制权的反转,把原本调用者通过代码实现的对象的创建,反转给 IoC 容器来帮忙实现,因此我们将这个过程称为 Spring 的“控制反转”。

依赖注入(Denpendency Injection,简写为 DI)在面向对象中,对象和对象之间是存在一种叫做“依赖”的关系。简单来说,依赖关系就是在一个对象中需要用到另外一个对象,即对象中存在一个属性,该属性是另外一个类的对象。

二、IOC 的工作原理

IOC 底层通过工厂模式、Java 的反射机制、XML 解析等技术,将代码的耦合度降低到最低限度,其主要步骤如下:

  • (1)在配置文件(例如 spring.xml)中,对各个对象以及它们之间的依赖关系进行配置;
  • (2)可以把 IOC 容器当做一个工厂,这个工厂的产品就是 Spring Bean;
  • (3)容器启动时会加载并解析这些配置文件,得到对象的基本信息以及它们之间的依赖关系;
  • (4)IOC 利用 Java 的反射机制,根据类名生成相应的对象(即 Spring Bean),并根据依赖关系将这个对象注入到依赖它的对象中。

由于对象的基本信息、对象之间的依赖关系都是在配置文件中定义的,并没有在代码中紧密耦合,因此即使对象发生改变,我们也只需要在配置文件中进行修改即可,而无须对 Java 代码进行修改,这就是 Spring IOC 实现解耦的原理。

三、IoC 容器的两种实现方式

(1)BeanFactory

BeanFactory 是 IoC 容器的基本实现,也是 Spring 提供的最简单的 IoC 容器,它提供了 IoC 容器最基本的功能,由 org.springframework.beans.factory.BeanFactory 接口定义。
BeanFactory 采用懒加载(lazy-load)机制,容器在加载配置文件时并不会立刻创建 Java 对象,只有程序中获取(使用)这个对对象时才会创建。

(2)ApplicationContext

ApplicationContext 是 BeanFactory 接口的子接口,是对 BeanFactory 的扩展。ApplicationContext 在 BeanFactory 的基础上增加了许多企业级的功能,例如 AOP(面向切面编程)、国际化、事务支持等。
当我们在加载配置文件的过程中,就会将配置文件中的对象创建。
在做服务器端开发的时候,使用 ApplicationContext 比较多,因为所有bean初始化操作在项目启动完成之前都已经初始化了。

4、ApplicationContext 接口常用的实现类

(1)ClassPathXmlApplicationContext
ClassPathXmlApplicationContext:从类加载路径下搜索配置文件,并根据配置文件来创建Spring容器。

eg:

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation);

(2)FileSystemXmlApplicationContext
FileSystemXmlApplicationContext:加载指定的文件系统路径中指定的 XML 配置文件,并根据配置文件来创建Spring容器。
eg:

 ApplicationContext applicationContext = new FileSystemXmlApplicationContext(String configLocation);

(3)ConfigurableApplicationContext
ConfigurableApplicationContext:是ApplicationContext的子接口,包含一些扩展方法。refresh() 和 close() 让 ApplicationContext 具有启动、关闭和刷新上下文的能力。所以要关闭 ApplicationContext 需要 new 此接口的对象调用 close() 方法。

(5)WebApplicationContext
WebApplicationContext:专门为 WEB 应用而准备的,它允许从相对于 WEB 根目录的路径中完成初始化工作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吟诗作对歌一曲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值