共计 2937 个字符,预计需要花费 8 分钟才能阅读完成。
因为 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 一个对象进去不香吗?
有这种想法这种显著就是「代码写得少了,想得多了」
咱们写代码,不仅仅是要能实现性能,实现完了当前咱们还得对写过的代码「保护」。如果咱们的代码写得很烂,那「保护」的老本就很高。
保护实际上是做什么事?
- 出了问题须要找到是哪块的代码有问题
- 在原有的根底上退出一些新的性能(也就是所谓的迭代)
面对反复的 / 繁琐的非业务代码:
- 如果程序出了问题,咱们得看吧?谁也保障不了反复的代码就没有问题。
- 咱们要想加一个新的性能,还得按原来的形式写吧?代码量会越来越多,越来越多….
上一期的「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 的时候,就会轻松很多。
还要一点就是不要被「名词」给吓唬了,之前不懂某个技术的时候,听他人讲一些名词,我对此齐全不懂。那就可能会认为这个技术会很牛逼,其实等真正接触下来,学习完了当前,其实发现也不过如此嘛。