(非原创,多篇文章理解整合)
1.前言
1.1 什么是framework?
framework字面翻译为框架。在IT语境中通常是指的是为了实现某个业界标准或完成特定基
本任务的软件组件规范,也指为了实现某个软件组件规范时,提供规范所要求之基础功能的
软件产品。
上述描述不由会想到另外一个单词 Library,库。库是代码的集合,软件行业中库中通常保存
的是一组常用的函数,或者在面向对象的世界里,保存了一系列的类来实现代码的复用。作
为用户的你只需要调用库中的方法即可,而不用再去创造方法,不是重复的”造轮子“。
1.2 framework和library有什么区别?
首先框架是相对库更大程度的一种规范,或又是针对此规范的实现。
Library和Framework最大的区别是:don’t call us, we’ll call you,是著名的The Hollywood principle-好莱坞原则。
如何理解上述区别?
Library调用的时候,我们可以按照自己的意愿来选择如何调用它。
Framework则是反转的,是框架决定如何调用你。这一设计思想称为控制反转IOC,ioc
是一种面向对象设计及编程的设计思想,后面会详细描述。
2. Spring 入门
Spring是一个用于Java企业开发,强大的轻量级应用开发框架。在某种程度上,Spring可以看
做是框架的框架——它可以整合多种框架,如:Struts、Hibernate等,也就有了我们所熟SSH
(Struts+Spring+Hibernate)。Spring采用分层架构的设计,发展至今,已经包含了20多个
模块,不同的模块有着不同的功能,可以选择使用。
3. Spring框架简介
Spring Framework是一个Java平台框架,它为开发Java应用程序的全面的基础架构支持。
Spring处理基础架构,以便你可以专注于应用程序。
3.1 Spring Framework架构组成
Spring框架由大约20个功能模块组成。 这些模块分为核心容器,数据访问/集成,Web,
AOP(面向方面的编程),仪器,消息传递和测试,如下图所示。
Core Container:容器包含了spring-core,spring-beans,spring-context,spring-context-
support,spring-expression这五个模块,包含IoC、DI核心特性。
AOP & Instrumentation:spring-aop提供了一个面向切面编程的实现,单独的spring-aspects模 块提供与AspectJ框架的集成。
Messaging:spring-messaging 是Spring 4中新添加的模块,为集成messaging api和消息协
议提供支持。同样也提供了一些映射消息到方法的注解,类似spring mvc注解。
Data Access/Integration:不难理解,为数据访问层提供支持,包含JDBC, ORM,OXM, JMS 和 Transaction 模块。
Web:包含spring-web,spring-webmvc, spring-websocket,和 spring-webmvc-portlet模块。主要为Web开发提供支持。
Test:spring-test模块使用JUnit或者TestNG为Spring各个组件提供单元测试与集成测试。
控制反转(IOC)就是Spring中两个主要的概念之一,另外一个就是AOP(面向切面)
3.2 IOC & DI
3.2.1 什么是IOC
IOC是Inversion of Control的缩写,多数书籍翻译成“控制反转”。IOC可以认为是一种全新的
设计模式,体现了著名的The Hollywood principle-好莱坞原则:don’t call us, we’ll call you。
简单来说就是把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现对外
部是透明的,从而降低了解决问题的复杂度,而且可以灵活地被重用和扩展。
IOC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖关系的对象之间的解耦。
3.2.2 控制反转(IOC)到底为什么要起这么个名字?
传统程序设计是在一个对象内部通过new创建它所依赖的对象,是程序员在代码中控制对
象的创建。这样类与类之间就高度耦合了,程序变得非常不灵活,不易于复用。而有了
IoC容器后,创建和查找依赖对象的控制权交到了容器手中,有容器注入依赖对象,对象
与对象之间的关系变成了松耦合。
软件系统在没有引入IOC容器之前,对象A依赖于对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象B或者使用已经创建的对象B。无论是创建还是使用对象B,控制权都在自己手上。
软件系统在引入IOC容器之后,这种情形就完全改变了,如上图所示,由于IOC容器的加入,对象A与对象B之间失去了直接联系,所以,当对象A运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要的地方。
总结:对象A获得依赖对象B的过程,由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。
3.2.3 什么是依赖注入(DI)?
2004年,Martin Fowler探讨了同一个问题,既然IOC是控制反转,那么到底是“哪些方面的控制被反
转了呢?”,经过详细地分析和论证后,他得出了答案:“获得依赖对象的过程被反转了”。控制被反转
之后,获得依赖对象的过程由自身管理变为了由IOC容器主动注入。于是,他给“控制反转”取了一个更
合适的名字叫做“依赖注入(Dependency Injection)”。他的这个答案,实际上给出了实现IOC的
方法:注入。所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。
依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。
IoC 告诉我们:容器控制对象,而 DI 告诉我们:被注入对象依赖IoC容器配置依赖对象。