Spring的体系结构、控制反转

一、Spring一共有十几个组件,但是真正的核心组件只有几个。
Spring的体系结构、控制反转

从这个图中我们可以看出Spring框架的核心组件只有三个:Core、Context和Beans。他们构建起了整个Spring的骨骼架构,没有他们就不可能有AOP、Web等上层的特性功能。上面这些是Spring特性功能。
其中比较重要的几个包:
AOP包(主要提供面向切面编程的实现);
Web(主要提供了Web应用开发的支持及针对Web应用的MVC思想实现) 、ORM(为Hibernate、Mybatis这类持久化框架提供支持);
还有Spring MVC(这个是它自带的一个web视图层,可以替代到Sturts2)。
Spring最最核心的就是AOP和下面Spring核心包,也是我们学习的重点。

二、Spring核心技术
Spring 两大核心技术:
控制反转(IoC:Inversion of Control ),也叫依赖注入(DI:Dependency Injection )。
面向切面编程(AOP:Aspect Oriented Programming)。
Spring的体系结构、控制反转

Spring三个核心组件(Core、Context、Beans)。如果再在他们三个中选一个核心来,那就非Beans莫属了,为何这样说?其实Spring就是面向Bean的编程(BOP,Bean Oriented Programming),Bean才是Spring中的真正主角。
Spring就是面向Bean的编程,在Spring中所有对象都可以看成一个Bean。

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

Spring的这些核心组件如何协同工作?
前面说Bean是Spring中的关键因素,那Context和Core又有何作用?前面把Bean比作一场演出中的演员的话,那么Context就是这场演出的舞台背景,而Core就是应该是演出的道具了。只有他们在一起才能具备演出一场好戏的最基本条件。当然有最基本的条件还不能使这场演出脱颖而出,还要他表演的节目足够的精彩,这些节目就是Spring提供的特色功能了。

Spring是怎么管理这些Bean的呢?
Spring把所有的Bean及它们之间的依赖关系以配置文件的方式组装起来,在一个叫IoC(Inversion of Control)的容器中进行管理,这也就是Spring的核心设计思想之一依赖注入机制,Spring的另一个核心设计思想叫做AOP,这两个概念在后续会有详细讲解。

一个Context基本上把spring具有的核心功能都包裹起来了,那么这就是spring框架运行需要的环境,也就是常说的上下文。任何一个框架运行都通过一个类来进行描述它执行时的环境,ServletContext也是一样,就是Servlet环境信息。

1.7 Spring的优点
总结起来,Spring作为一个开源的轻量级的IOC和AOP容器框架,具有以下优点:
1、低侵入式设计:非入侵式设计,基于Spring开发的应用一般不依赖于Spring的类
2、独立于各种应用服务器,真正实现:一次编写,到处运行。
3、Spring的依赖注入特性使Bean与Bean之间的依赖关系变的完全透明,降低了耦合度:使用SpringIOC容器,将对象之间的依赖关系交给Spring,降低组件之间的耦合性,让我们更专注于应用逻辑。
4、它的面向切面编程(AOP)特性允许将一些通用任务如安全、事务、日志等进行集中式处理。
5、并且它还提供了与第三方持久层框架的良好整合,并简化了底层数据库访问。
6、高度的开放性(可以和Struts2、Hibernate、MyBatis、CXF等很多主流第三方框架无缝整合)。

1.8 控制反转(依赖注入)
1.8.1 什么是控制反转
将组件对象的控制权从代码本身转移到外部容器。
1、组件化的思想:分离关注点,使用接口,不再关注实现。

Spring的体系结构、控制反转
2、依赖的注入:将组件的构建和使用分开。

Spring的体系结构、控制反转

当某个角色(比如一个java实例,调用者)需要另一个角色(另一个java实例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但是在spring里,创建被调用者的工作不再由调用者来完成。因此被称为控制反转;创建被调用者实例的工作通常由spring容器来完成,然后注入调用者,因此也称为依赖注入。这样给程序带来很大的灵活性,这样也实现了我们的接口和实现的分离。
简而言之也就是说我们要获得一个对象,不由我们开发者自己创建,而是由我们的容器来注入给我们的程序来使用。