Spring框架学习笔记(一):官方文档介绍,IoC与AOP概念学习

最近实习用到Spring的开发框架,但是之前没有接触过,因此希望利用网上的资源来学习以下。

Spring官方给出了非常全面的介绍,非常适合我这种完全的小白……
在这一系列学习中,我阅读的主要资源是5.1.2 Reference Doc.,以及论坛大神的讲解blog。另外,Spring官方也给出了非常详细的API文档,适合较为熟悉的使用者查阅。
由于本人完全入门级,因此决定从reference一点点读起。

官方文档:Spring Framework Documentation
https://docs.spring.io/spring...

由于缺乏相关概念基础,因此本文开头对Spring官方文档的结构进行简单介绍,之后讲解Spring框架的两大核心:IoC、AOP,在下一篇文章中再开始详细学习Spring官方文档。


documentation主要包括6部分:Core, Testing, Data Access, Web Reactive, Integration, Language。

Core

这一部分介绍了Spring的一些基础核心的技术和功能,属于Spring必读内容。Spring Framework中最重要的一部分是控制反转容器(Inversion of Control container, IoC),而这一功能是由面向方面的编程技术(Aspect-Oriented Programming technology, AOP)实现的。IoC和AOP可以看作Spring框架最重要的两个核心。

为了更详细地阐释Spring Framework的功能,这里先介绍一下IoC和AOP两个概念。

概念引入

1.IoC(控制反转)与DI(依赖注入)

这一部分借鉴了论坛大神的分享:“谈谈对Spring IOC的理解”,https://blog.csdn.net/qq_2265...
这篇blog除讲解控制反转和依赖注入的理论认识以外,还提供了一个小的实例分析,值得阅读。

IoC
IoC本质上是一种设计思想,在IoC中,开发者将设计好的对象交给容器控制,而不是在对象内直接控制。理解IoC的关键点如下:

  • 谁控制谁,控制什么:在传统的Java程序设计中,开发者在对象内部通过new创建新对象,是程序主动创建依赖对象;而在IoC中,专门有一个容器创建这些对象,即由IoC控制对象的创建。因此在IoC中,IoC容器控制对象,主要控制外部资源获取(包括对象、文件等)
  • 为何是反转,哪些方面反转:传统java程序设计中,是由开发者自己在对象中主动控制去直接获取依赖对象,即正转;而在反转中,是容器帮忙创建及注入依赖对象。反转的含义即,容器帮我们查找并注入依赖对象,对象只是被动地接收依赖对象。反转的实际是依赖对象的获取过程

IoC是Spring的核心。对于Spring而言,IoC的含义即由Spring来负责控制对象的生命周期和对象间关系。也就是说,所有的类都会在Spring的容器中登记,我们告诉Spring我们是什么、需要什么,由Spring在系统运行到适当的时候,将需要的东西主动给我们,同时也把我们交给其他需要我们的东西。
在传统java开发中,所有类的创建、销毁(即对象的生命周期)都由引用它的对象控制,而在Spring中,这一控制权转移到了Spring容器中。

DI
DI(Dependency Injection, 依赖注入)可以理解为对IoC从另一个角度的描述。
DI的含义即,组件之间的依赖关系是由容器在运行期间决定的,由容器动态地将某个依赖关系注入到组件之中,即容器动态地向某个对象提供它所需要的外部资源(对象、资源、常量数据)。

这里所谓的“依赖”,指的就是程序中的对象依赖于IoC容器。

IoC注入的类型
包括三种:构造函数注入、属性注入和接口注入。
其中,Spring支撑构造函数注入和属性注入两种。

  • 构造函数注入:通过调用类的构造函数,将接口实现类通过构造函数变量传入。这种方法在调用类创建的时候就将接口实现类的依赖传入。
  • 属性注入:有选择地通过setter方法完成调用类所需依赖的注入,而无需在创建类时注入,更加灵活方便。
  • 接口注入:将调用类所有依赖注入的方法抽取到一个接口中,调用类通过实现该借口提供相应的注入方法。通过接口注入需要额外声明一个接口,增加了类的数目,且其效果与属性注入无本质区别,因此不提倡。
  • 通过容器完成依赖关系的注入:由容器完成类的初始化与装配工作,让开发者从底层实现类的实例化、依赖关系装配等工作中脱离出来,专注于业务逻辑开发工作。Spring框架即这样的容器,它通过配置文件或注解描述类和类之间的依赖关系,自动完成类的初始化和依赖注入工作。

2.AOP面向方面程序设计

AOP概念的学习借鉴了这篇blog:“Spring3: AOP”, http://www.cnblogs.com/xrq730...

AOP可以理解为面向对象编程(OOP)的补充和完善。OOP通过引入封装、继承、多态等概念建立了对象的层次结构,适用于定义对象间的纵向关系。但对于对象的横向关系的定义,OOP并不适用,因此提出了AOP的概念。

AOP主要关注影响了多个类的公共行为,例如日志代码、异常处理、安全性等,这类代码与所对应的对象的核心功能(业务功能)毫无关系。在OOP中,这类代码会导致大量冗余,不利于模块重用。而在AOP中,其使用“横切”(cross cutting)技术,将这类代码从原属的封装对象中提取出来,封装到一个可重用模块中,称为“Aspect”。这样的操作降低了模块间的耦合度,利于操作和维护。

在AOP中,其将软件系统分为“核心关注点”和“横切关注点”。其中,“横切关注点”为横切出来的aspect,“核心关注点”为然软件系统的主体业务代码。AOP的作用即将二者分离。

对Spring Framework中两大核心概念的简答介绍就到这里,下一篇开始正式学习Spring framework的文档。

相关推荐