spring框架的设计理念

Posted by zhida on October 22, 2016

This document is not completed and will be updated anytime.

IoC (控制反转) 和 DI (依赖注入)

IoC是一种机制,实现方式有很多,比如工厂模式、服务定位模式、以及DI

在传统的编程方式中,业务逻辑的流程是由应用程序中的早已被设定好关联关系的对象来决定的。在使用控制反转的情况下,业务逻辑的流程是由对象关系图来决定的,该对象关系图由装配器负责实例化,这种实现方式还可以将对象之间的关联关系的定义抽象化

IoC思想:会有一段代码拥有最初的控制线程,用来调用你的代码

  • 调用者的代码,处理程序的执行顺序
  • 接受调用的代码处理 程序逻辑

DI (依赖注入) 是 IoC的一种特定形态,是指 寻找依赖项的过程不在当前代码的直接控制下

场景:
  • 命令行程序: 所有的执行顺序都在主流程中控制。
  • GUI图形程序: 将流程控制放在GUI的图形界面上, 控制被反转了
普通代码转成DI的过程步骤

普通代码

{
	Robot robot = new CookieRobot()
}

工厂模式

(Stirng robotName){
	Robot robot = Factory.newInstance(robotName)
}

DI模式

(Robot robot){
	Robot robot = robot
}

DI模式存在问题:没有一个配置项来控制到底需要注入什么类,所以DI框架需要带一个IoC容器

Spring

  • spring 特性:transaction / web / jdbc / orm / aop / jmx …
  • spring 架构:Bean / Context / Core

Spring 框架中的核心组件只有三个:Core、Context 和 Beans。它们构建起了整个 Spring 的骨骼架构。没有它们就不可能有 AOP、Web 等上层的特性功能。下面也将主要从这三个组件入手分析 Spring。

如果再在它们三个中选出核心的话,那就非 Beans 组件莫属了,为何这样说,其实 Spring 就是面向 Bean 的编程(BOP,Bean Oriented Programming),Bean 在 Spring 中才是真正的主角。

Bean 在 Spring 中作用就像 Object 对 OOP 的意义一样,没有对象的概念就像没有面向对象编程,就像一次演出舞台都准备好了但是却没有演员一样。为什么要 Bean 这种角色? Bean 为何在 Spring 如此重要,这由 Spring 框架的设计目标决定,Spring 解决了一个非常关键的问题: 他可以让你把对象之间的依赖关系转而用配置文件来管理,也就是他的依赖注入机制。而这个注入关系在一个叫 Ioc 容器中管理,Spring 正是通过把对象包装在 Bean 中,从而达到对这些对象管理以及一些列额外操作的目的。

它这种设计策略完全类似于 Java 实现 OOP 的设计理念,当然了 Java 本身的设计要比 Spring 复杂太多太多,但是都是构建一个数据结构,然后根据这个数据结构设计他的生存环境,并让它在这个环境中按照一定的规律在不停的运动,在它们的不停运动中设计一系列与环境或者与其他个体完成信息交换。这样想来回过头想想我们用到的其他框架都是大慨类似的设计理念。

核心组件如何协同工作?

前面把 Bean 比作一场演出中的演员的话,那 Context 就是这场演出的舞台背景,而 Core 应该就是演出的道具了。只有他们在一起才能具备能演出一场好戏的最基本的条件。当然有最基本的条件还不能使这场演出脱颖而出,还要他表演的节目足够的精彩,这些节目就是 Spring 能提供的特色功能了。

我们知道 Bean 包装的是 Object,而 Object 必然有数据,如何给这些数据提供生存环境就是 Context 要解决的问题,对 Context 来说他就是要发现每个 Bean 之间的关系,为它们建立这种关系并且要维护好这种关系。所以 Context 就是一个 Bean 关系的集合,这个关系集合又叫 Ioc 容器,一旦建立起这个 Ioc 容器后 Spring 就可以为你工作了。

Core 就是发现、建立和维护每个 Bean 之间的关系所需要的一些列的工具,从这个角度看来,Core 这个组件叫 Util 更能让你理解。

参考网站