spring框架 -- 核心IOC容器概述

小咪咪 2024-04-18 16:45 147阅读 0赞

IoC 容器概述

前言

本节复习一下框架知识,罗列以下几点。

  1. IoC 概念所包含的设计思想
  2. Java 语言反射技术
  3. BeanFactory、ApplicationContext 以及 WebApplicationContext 基础接口
  4. Bean 的生命周期

IoC 概述

IoC(控制反转:Inverse of Control)是 Spring 容器的内核,AOP、声明式事务等功能
是在此基础上进行延伸

理解 IoC 的概念

用一个经典的例子比较合适

张之亮的《墨攻》讲述了战国时期
其中有一个场景:当刘德华所饰演的墨者革离到达梁国都城下,城上梁国守军问到:
“来者何人?”刘德华回答:“墨者革离!”

我们通过一个 Java 类为这个“城门叩问”的场景进行编剧,并借此理解 IoC 的概念:
在这里插入图片描述

我们会发现以上剧本在①处,作为具体角色饰演者的刘德华直接侵入到剧本中,使剧本和演员直接耦合在一起

解释一下耦合:,必须是刘德华,刘德华才有方法,输出墨者隔离,必须是刘德华,其他的类里面没有这个方法。剧本把人物写死了;不灵活

一个明智的编剧在剧情创作时应围绕故事的角色进行,而不应考虑角色的具体饰演者,

这样才可能在剧本投拍时自由地遴选任何适合的演员,而非绑定在刘德华一人身上。

通过以上的分析,我们知道需要为该剧本主人公革离定义一个接口:
在这里插入图片描述
在这里插入图片描述

我们可以看出 MoAttack 同时依赖于 GeLi 接口和 LiuDeHua 类,
并没有达到我们所期望的剧本仅依赖于角色的目的。但是角色最终必须通过具体的演员才
能完成拍摄,如何让 LiuDeHua 和剧本无关而又能完成 GeLi 的具体动作呢?当然是在影片
投拍时,导演将 LiuDeHua 安排在 GeLi 的角色上,导演将剧本、角色、饰演者装配起来

现在我们可以反过来讲解 IoC 的概念了。IoC(Inverse of Control)的字面意思是控制
反转,它包括两个内容:

  • 其一是控制
  • 其二是反转

那到底是什么东西的“控制”被“反转”了呢?对应到前面的例子,“控制”是指选
择 GeLi 角色扮演者的控制权;“反转”是指这种控制权从《墨攻》剧本中移除,转交到导
演的手中。对于软件来说,即是某一接口具体实现类的选择控制权从调用类中移除,转交
给第三方决定。

因为 IoC 确实不够开门见山,因此业界曾进行了广泛的讨论,最终软件界的泰斗级
人物 Martin Fowler 提出了 DI(依赖注入:Dependency Injection)的概念用以代替 IoC,
即让调用类对某一接口实现类的依赖关系由第三方(容器或协作类)注入,以移除调用
类对某一接口实现类的依赖。“依赖注入”这个名词显然比“控制反转”直接明了、易于
理解。

IoC 的类型

从注入方法上看,主要可以划分为三种类型:构造函数注入、属性注入和接口注入。
Spring 支持构造函数注入和属性注入。
构造函数注入

在这里插入图片描述

在这里插入图片描述
MoAttack 的构造函数不关心具体是谁扮演革离这个角色,只要在①处传入的扮演者按
剧本要求完成相应的表演即可。角色的具体扮演者由导演来安排

接口注入

将调用类所有依赖注入的方法抽取到一个接口中,调用类通过实现该接口提供相应的
注入方法。为了采取接口注入的方式,必须先声明一个 ActorArrangable 接口:

在这里插入图片描述

Director 通过 ActorArrangable 的 injectGeli()方法完成扮演者的注入工作。

在这里插入图片描述
由于通过接口注入需要额外声明一个接口,增加了类的数目,而且它的效果和属性注
入并无本质区别,因此我们不提倡采用这种方式。

通过容器完成依赖关系的注入

虽然 MoAttack 和 LiuDeHua 实现了解耦,MoAttack 无须关注角色实现类的实例化工
作,但这些工作在代码中依然存在,只是转移到 Director 类中而已。假设某一制片人想改
变这一局面,在选择某个剧本后,希望通过一个“海选”或者第三中介机构来选择导演、
演员,让他们各司其职,那剧本、导演、演员就都实现解耦了

所谓媒体“海选”和第三方中介机构在程序领域即是一个第三方的容器,它帮助完成
类的初始化与装配工作,让开发者从这些底层实现类的实例化、依赖关系装配等工作中脱
离出来,专注于更有意义的业务逻辑开发工作。这无疑是一件令人向往的事情,Spring 就
是这样的一个容器,它通过配置文件或注解描述类和类之间的依赖关系,自动完成类的初
始化和依赖注入的工作。下面是 Spring 配置文件的对以上实例进行配置的配置文件片断

在这里插入图片描述

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

准备就绪的 Bean 实例,后续可直接使用

Spring 为什么会有这种“神奇”的力量,仅凭一个简单的配置文件,就能魔法般地实
例化并装配好程序所用的 Bean 呢?这种“神奇”的力量归功于 Java 语言本身的类反射功能。

发表评论

表情:
评论列表 (有 0 条评论,147人围观)

还没有评论,来说两句吧...

相关阅读