因为Spring家族的货色很多,一次性写完也不太事实。所以这一次先更新Spring「最外围」的知识点:AOP和IOC

无论是入门还是面试,了解AOP和IOC都是十分重要的。在校招的时候,我没被问过Mybatis/Hibernate/Struts2这样的框架,而Spring就常常会被问到。

作为浏览福利,我整顿spring相干的学习材料(蕴含了手写pdf、脑图、面试真题)有spring boot、spring cloud、spring Ioc、spring aop等,当初收费分享给浏览到本篇文章的Java程序员敌人们,须要的点击下方链接支付~

最全spring学习笔记+面试真题

为什么要用Spring

当年的我,刚学Spring的时候,会想:『这IOC和AOP』是什么鬼玩意啊?一大堆的名词「管制反转」「依赖注入」「面向切面编程」。这是在给我搞笑的吧。

在最开始学的IOC折腾了一大堆的玩意,后果就是在管「创建对象」的事??逗我呢???我间接new一个对象进去不香吗?

有这种想法这种显著就是「代码写得少了,想得多了

咱们写代码,不仅仅是要能实现性能,实现完了当前咱们还得对写过的代码「保护」。如果咱们的代码写得很烂,那「保护」的老本就很高。

保护实际上是做什么事?

  1. 出了问题须要找到是哪块的代码有问题
  2. 在原有的根底上退出一些新的性能(也就是所谓的迭代)

面对反复的/繁琐的非业务代码:

  1. 如果程序出了问题,咱们得看吧?谁也保障不了反复的代码就没有问题。
  2. 咱们要想加一个新的性能,还得按原来的形式写吧?代码量会越来越多,越来越多….

上一期的「Mybatis」教程也讲到了,咱们的JDBC写得好好的,运行的效率也是杠杠的。然而JDBC须要咱们「自行」解决的细节太多了,咱们须要在里边增加各种「反复」的代码。

咱们应用ORM框架,那么咱们就能够更加「专一」去实现自身的业务,ORM框架把「反复」的代码都屏蔽掉,代码保护起来就比JDBC要不便。

Spring IOC 解决的是 对象治理和对象依赖的问题

Spring AOP 解决的是 非业务代码抽取的问题

(这里要是没根底的同学,可能看不太懂,上面再来解释解释一下应该就没问题了)

Spring IOC

提到Spring IOC,轻易去网上一搜,咱们就能够看到「依赖注入」「管制反转」这两个词。

很多人都会试图要把这两个词给解释分明,然而太难了,这两个词真的是太难给解释分明了。

Spring IOC 解决的是对象治理和对象依赖的问题。原本咱们的对象都是new进去的,而咱们如果应用Spring 则把对象交给「IOC容器」来治理。

三歪这逼搞事件了。「依赖注入」和「管制反转」都没讲,当初还来了个「IOC容器」。

「IOC容器」是什么?咱们能够了解为是一个「工厂」,咱们把对象都交由这个「工厂」来治理,包含对象的创立和对象之间的依赖关系等等。等咱们要用到对象的时候,就从这个「工厂」里边取出来。

「管制反转」指的就是:原本是「由咱们本人」new进去的对象,当初交给了IOC容器。把这个对象的「控制权」给「他方」了。「管制反转」更多的是一种思维或者说是设计模式,把原有由本人掌控的事交给「他人」来解决。

「依赖注入」更多指的是「管制反转」这个思维的实现形式:对象无需自行创立或治理它们的依赖关系,依赖关系将被「主动注入」到须要它们的对象当中去。

最简略了解「依赖注入」和「管制反转」:原本咱们的对象都是「由咱们本人」new进去的,当初咱们把这个对象的创立权限和对象之间的依赖关系交由「IOC容器」来治理。

悄悄话:我集体自身是不太喜爱推敲每个词的含意的,很多时候大佬们也很难解释分明。如果是初学的同学,也不必太纠结每个名词的具体含意,深究上来也没有太大的必要。

当初问题又来了,为什么咱们要把对象给「IOC容器」来治理呢?要了解这个,我倡议能够先去看看我写过的「工厂模式

实践上,咱们能够把「IOC容器」也当做是一个「工厂」,应用IOC的益处就是:

  • 将对象集中统一治理,便于批改
  • 升高耦合度(调用方无需本人组装,也无需关怀对象的实现,间接从「IOC容器」取就好了)

IOC 须要学什么?

咱们在应用Spring的时候,首先咱们要学习的就是怎么把对象交给「IOC容器治理」

Spring提供了四种形式:

  • 注解
  • XML
  • JavaConfig
  • 基于Groovy DSL配置

总的来说:咱们以XML配置+注解来拆卸Bean比拟多,其中注解这种形式占大部分。

把对象放到「IOC容器」了当前,对象与对象之间是有关系的,咱们须要把对象之间的依赖通知Spring,让它来帮咱们解决掉对象的依赖关系。

「对象之间的关系」别想得太简单了。在日常开发中其实很多时候就是A对象里边有B对象的属性而已。

一般来说咱们会通过结构器或者属性(setting办法)的形式来注入对象的依赖

举个例子:日常开发中,咱们很多时候用@Component注解标识将对象放到「IOC容器」中,用@Autowired注解将对象注入

上面这张图就很好总结了以各种形式来对Bean的定义和注入

Spring AOP

AOP:Aspect Object Programming 「面向切面编程」,听起来是不是很牛逼。

Spring AOP次要做的事件就是:「把反复的代码抽取,在运行的时候往业务办法上动静植入“切面类代码”」

举个例子,当初咱们有以下的代码:

下面的代码其实最外围的就一行代码:「保留user对象到数据库中」

session.save(user);

咱们的数据库表必定不止user一张表,对数据库的增删改也必定不止add()办法一个。所以咱们能够设想到:对数据库的每次操作,都要写「开启事务」和「敞开事务」这种代码。

这种代码对咱们来说是反复的,于是咱们会想把这种代码给「抽取」进去。

如果咱们单纯用OOP(面向对象)的思维去把代码给优化掉,最终咱们的成果可能是这样的:

即便这样看起来代码曾经很少了,但咱们细想一下会发现:update()/delete()办法同样也会有aop.begin()这样的反复代码的。

咱们想要「毁灭」掉这些反复代码,能够怎么做?这个时候咱们应该能想到「动静代理」,通过动静代理,咱们能够把对象「加强」,将非业务代码写在要「加强」的逻辑上。

完了当前,咱们就能够通过「加强后的对象」去调用办法,最终屏蔽掉「反复代码」

成果可能会如下:

下面是咱们手动写的代理来实现对「非业务代码」的抽取,相似这样的场景会有很多:比方咱们要做权限管制,要对参数进行校验等等。

Spring 反对了AOP,让咱们能够不必本人「手动」去写代理对象,达到将「非业务代码」的抽取的成果。

咱们能够体验一波Spring AOP是怎么弄的,跟下面的比照比照:

成果如下:

总结

倡议:在学习IOC之前,能够先看看「工厂模式」。在学习AOP之前,能够先看看「代理模式」

了解了「工厂模式」那就晓得为什么咱们不再间接new对象,了解了「代理模式」,咱们就晓得Spring AOP的底层技术其实就是「动静代理」,这样学习IOC和AOP的时候,就会轻松很多。

还要一点就是不要被「名词」给吓唬了,之前不懂某个技术的时候,听他人讲一些名词,我对此齐全不懂。那就可能会认为这个技术会很牛逼,其实等真正接触下来,学习完了当前,其实发现也不过如此嘛。