Spring IOC AOP| 青训营笔记

224 阅读6分钟

 引用转载

谈谈对Spring IOC的理解 - 孤傲苍狼 - 博客园 (cnblogs.com)

www.iteye.com/blog/jinnia…

(172条消息) 细说Spring——AOP详解(AOP概览)_Jivan2233的博客-CSDN博客_aop

浅析Spring AOP(一)——基本概念 - 简书 (jianshu.com)

IOC/DI

1.IOC是什么?

IOC(Ioc—Inversion of Control),即控制反转,不是什么技术,是一种设计思想。在Java中,IOC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。 如何理解好Ioc呢?理解好IOC的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了” ,那我们来深入分析一下:

  1. 谁控制谁,控制了什么: 传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IOC是有一个专门的容器去创建这些对象,即由IOC对象容器来控制对象的创建;谁控制谁?当然是IOC容器控制了对象;控制了什么?那就是主要控制了外部资源的获取(不只是对象,还有文件呢。)
  2. 反转又是什么意思呢?那方面反转了呢?: 有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,这就是正转。而反转是由容器来帮忙创建对象以及注入依赖对象,为什么是反转呢?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转,哪方面反转了呢?依赖对象的获取被反转了。

​编辑

图1 传统应用程序示意图

​编辑

图2 通过容器去管理的应用程序的结构

2.DI是什么?

DI(Dependency Injection),即"依赖注入":组件间的依赖关系有容器在运行期间决定,形象的说,由容器动态的将依赖关系注入到组件当中。依赖注入的目的并非为软件系统带来更多的功能,而是为了提升组件的重用频率,并为系统搭建一个灵活的可扩展的平台。通过依赖注入我们只需要简单的配置就可以获取需要的资源,完成自己的自身业务逻辑,而不需要了解资源来自何处?由谁实现。

谁依赖谁,为什么需要依赖,谁注入谁,注入了什么?

  1. 谁依赖于谁:当然是程序依赖于IOC容器。
  2. 为什么需要依赖:应用程序需要IOC容器来提供对象需要的外部资源
  3. 谁注入谁:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)
  4. 注入了什么:就是注入了某个对象所需要的外部资源(包括对象、资源、常量数据)

3.IOC和DI的关系?

其实他们是同一个概念的不同角度的描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,相对IoC 而言, “依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”。

4.IOC/DI带来的好处呢?

IOC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是 松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。其实IOC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IOC/DI思想中,应用程序就变成被动的了,被动的等待IOC容器来创建并注入它所需要的资源了。

AOP

1.AOP是什么?

面向切面编程通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

我们先说下什么是切面:

讲个例子:用刀把一个西瓜分成两瓣,切开的切口就是切面;炒菜,锅与炉子共同来完成炒菜,锅与炉子就是切面。web层级设计中,web层->网关层->服务层->数据层,每一层之间也是一个切面。web层级设计中,web层->网关层->服务层->数据层,每一层之间也是一个切面。

我们一般做活动的时候,一般对每一个接口都会做活动的有效性校验(是否开始、是否结束等等)、以及这个接口是不是需要用户登录。

按照正常的逻辑,我们可以这么做。

​编辑

这有个问题就是,有多少接口,就要多少次代码copy。对于一个“懒人”,这是不可容忍的。好,提出一个公共方法,每个接口都来调用这个接口。这里有点切面的味道了。

​编辑

同样有个问题,我虽然不用每次都copy代码了,但是,每个接口总得要调用这个方法吧。于是就有了切面的概念,我将方法注入到接口调用的某个地方(切点)。

​编辑

这样接口只需要关心具体的业务,而不需要关注其他非该接口关注的逻辑或处理。

红框处,就是面向切面编程。

与OOP对比,AOP是处理一些横切行问题。这些横切性问题不会影响到主逻辑的实现,但是会散落到代码的各个部分,难以维护。AOP就是把这些问题和主业务逻辑分开,达到与主业务逻辑解耦的目的。

传统OOP是自上而下的逻辑开发;

​编辑

AOP是一种面向切面的编程思想。这些横切性问题,把它们抽象为一个切面,关注点在切面的编程,这就是所谓的AOP。

​编辑

\