如何理解Spring框架的核心设计思想IoC模式

Spring不单单只是一个框架,现在已经成为了一个产品家族,包括一系列以Spring命名的产品。整个Spring家族最早的成员Spring框架,是目前流行的web开发框架Spring Boot以及微服务治理框架Spring Cloud的基础,可以说Spring框架的出现改变了企业级互联网Java开发的历史。

从Spring框架说起

Spring框架诞生的时候,正是Java EE和EJB大行其道之时,Rod Johnson认为EJB对于应用开发太过臃肿,因此设计了轻量级的开发框架Spring。

如何理解Spring框架的核心设计思想IoC模式

Spring框架的核心就是对象容器(Bean Container)

Spring核心设计思想是控制反转(IoC:Invension of Control),这个模式允许Spring框架可以和各种其他框架相互结合,成为一个万能的连接器,降低了程序模块间的耦合性。

比如最早流行的Web MVC框架Apache Struts,可以和Spring相结合,再加上持久层框架Hibernate,组成了当时最流行的SSH框架组合开发Java web程序。

后来MVC框架由Struts1.x升级为Struts2.x,又被Spring MVC所代替;持久层框架可以换成iBatis,又改名为MyBatis,Hibernate也升级为Spring Data JPA;整个框架组合中的Spring框架一直都在,真是铁打的Spring,流水的持久层。

那么究竟该如何理解Spring的IoC设计模式呢?IoC中文译为“控制反转”,那么究竟是谁的控制,又被谁反转了呢?

IoC思想起源

业内公认的IoC这个概念是1996年软件专家Michael Mattson在一篇有关探讨面向对象框架的文章中最先提出的。对于IoC概念的阐述,大家普遍推荐的文章是Martin Fowler的名篇《IoC容器和依赖注入模式》。

如何理解Spring框架的核心设计思想IoC模式

Martin Fowler是一位著名软件专家,专注于OOAD、UML、DDD以及敏捷开发

Martin在书中写道:

“我第一次接触到的控制反转针对的是用户界面的主控权…. 早期的用户界面是完全由应用程序来控制的,你预先设计一系列命令,例如输入姓名、输入地址等,应用程序逐条输出提示信息,并取回用户的响应。而在图形用户界面环境下,UI框架将负责执行一个主循环,你的应用程序只需为屏幕的各个区域提供事件处理函数即可。在这里,程序的主控权发生了反转:从应用程序移到了框架。”

早期用户界面基本都是通过输入命令行进行交互的,用户的焦点只能在当前的命令行,执行完一条才能继续执行下一条。因此程序可以通过顺序执行的方式来处理用户输入的命令。

图形化界面用户的命令变成对控件的随机操作,应用程序无法通过顺序执行的方式来处理,因此应用程序变成了一个循环,统一接收用户的命令,在根据命令选择调用对应的处理函数。

开发者发现GUI程序的处理逻辑都是一样的,可以把这些共性的部分提取出来,进行复用。开发者要做的只是配置命令或事件对应的处理函数,以及开发每个处理函数的内部实现。被提取出来的共性的部分,就是框架。

对事件处理函数调用的控制权,由过去开发者来编写主程序逻辑来控制,反转到了由框架来控制。这就是控制反转的概念。

IoC对象容器

在面向对象编程中,程序是由对象组成的。程序要用到某个对象的时候,这个对象要先被创建(new)出来,然后再调用对象的方法,实现程序的运行。对象容器就是管理对象的组件。

IoC 容器就是把对象的创建,由应用程序主动创建,反转为由容器来被动创建。IoC容器是Spring框架的核心。

如何理解Spring框架的核心设计思想IoC模式

IoC解决了对象间依赖关系的自动建立,取消了对象间的代码耦合

当A类的对象需要用到B类的对象方法时,由容器负责创建B对象,A对象向容器索要B对象的时候,容器就把B对象的引用配置给A对象,这样就完成了对象间依赖的装配。之后,A对象就可以调用B对象的方法了。

通过IoC容器,A对象不需要显示地创建(new)B对象。通常B类继承自接口,A类的代码只需要按照接口来开发,而不需要关心B类的具体实现,甚至不需要知道B类的具体类名,由容器来自动装配具体的对象。

A和B之间的依赖关系不需要在代码中进行耦合实现,这样IoC容器就实现了解耦的作用。

EJB vs Spring

EJB和Spring都是IoC容器,EJB曾经是企业级Java开发的标准(J2EE的一部分),各大公司的J2EE服务器都支持EJB,包括Oracle(BEA)的Weblogic、IBM的Websphere等。

只不过Spring更轻量级,更适合互联网应用的开发。随着近20年互联网的蓬勃发展,Spring也逐步成为大家公认的标准了。虽然EJB风光不比当年,不过至今仍然在很多企业级应用中发挥着作用。

Mybatis Oracle https Java http 微服务 MVC 升级 OT
分享到:

您可能还会对下面的文章感兴趣: