0%

简单说 Spring 原理

简单说 Spring 原理

我先来,千万别较真,千万别较真,千万别较真!

先看官网介绍哈

The Spring Framework provides a comprehensive programming and configuration model for modern Java-based enterprise applications - on any kind of deployment platform.

A key element of Spring is infrastructural support at the application level: Spring focuses on the “plumbing” of enterprise applications so that teams can focus on application-level business logic, without unnecessary ties to specific deployment environments.

我来翻译一下,就是说(等等,我软件呢?谁动了啊!)

额,就是说:

Spring框架为任何类型的部署平台上的基于Java的现代企业应用程序提供了全面的编程和配置模型。

Spring的一个关键元素是在应用程序级别的基础架构支持:Spring专注于企业应用程序的“管道”,以便团队可以专注于应用程序级别的业务逻辑,而不必与特定的部署环境建立不必要的联系。

简单理解呢就是让你关注业务而非琐碎的、无关紧要的其他东西。好的,那么 Spring 是怎么做到的呢?其实也不难,先这样,再这样,然后再那样,最后再这样(啊,放错了)

其实也不难,主要是它有两大法宝,唉,知道的同学肯定要说了啊;我知道,IOC、AOP嘛!没错就是这两玩意,哪怕是还没内卷那会,我也听腻了,今天我们就来唠叨唠叨这两玩意它的一些原理或者说特点。

IOC

咱先说这 IOC,英文那就是 Inversion of Control,什么意思呢?控制反转,不让你控制我了,我要自己控制自己,这就是控制反转,我说那还得了,这程序它不听话了都!唉,不是这样理解的,其实啊,这代表这程序,它成熟了,它呀,可以自己干自己该干的事情了,不需要你管它了;这样子有什么好处呢?有啊,就像你家的熊孩子,还小的时候,特别黏人,不能没人带,你呢,总是需要找人帮忙看看,自己才有空闲出去玩,后来呢,它长大了,它就会自己出去玩了,熊是熊了点,但你也空闲不少啊,有时间可以看看书,喝喝茶,多好啊!咱说回来啊,这控制反转呢,就是让你少花费心思在这些地方,这样不就可以像官网说的 “可以专注于应用程序级别的业务逻辑”了吗。

那前面呢,其实只是IOC的一个思想,它不是一个实现,毕竟啊,你不能指望它真的能自己控制自己。所以呢,我们偷偷引入一个东西,也就是容器,由这个容器来管理它。这个啊,就像你把你家小孩送幼儿园,你交钱,剩下交给幼儿园。那么说到这里啊,大家应该也明白了,它呢,并不能自己控制自己,还是得靠容器;那么这个容器,又是何方神圣呢?

其实这个容器呢,也不难,名副其实,就是一个装东西的东西,有人说你套娃呢?我没有,不过这容器确实不禁止你往容器放容器,比如父子容器,就像子容器塞进了父容器里面,有时候呢,就会穿过子容器,从父容器取东西。好了咱说回来,容器就是一存东西的,这东西很常见啊,Java 集合框架啊,大学学过,还学了好几个,我现在还记得,什么 List,Map,Set 啥的。对!没错,真让你蒙对了!原理确实是这个,这个东西呢,选来选取,我们就选 Map 吧。众所周知,Map 是数组+链表为底层实现的键值对容器啊,因为有这个键值对的存在呢,我们就可以非常准确无误的存放和读取,就像银行账户吧,你往你账户存钱,再从你账户就能取到之前存的钱,非常有效的避免了“乱拿乱放”问题。好的,那我们就说完了容器的第一个特点,就是能存能取,这时候你就会说,这不废话吗?啊确实!行,我们整点正常的特点,那其实接下来要说的特点呢,都是围绕着取这个动作的。

其实上面的特点呢,说的不是特别清晰,这存的是什么?取的又是什么?总不可能和银行一样,都是钱吧!当然不是,这存的呢,一般是 Class。什么是 Class? Class 就是一设计图,照着这个设计图呢,容器 Duang 的一下,就给了一个对象!你说还有这好事?写个代码还有对象领?不是的,这个对象呢,不是那个对象哈,这个呢,是 Java 实例化出来的对象,用来调用方法,获取字段的。那么也就是说,这个容器,它还是个工厂?它还能生产对象呢!没错,但严格说对象其实也不是它生产的,对象呢,其实是 JVM 生产的对不对?它呢,就负责加工,所以说,其实也就是个加工工厂。所以咱这第二个特点呢,就是工厂,能照着设计图加工一个对象出来。你肯定要说啦,这有啥用,这不产生中间商差价了,我直接找 JVM 爸爸行不行?别急,可以是可以,但咱用这个东西,就一点有它的用处,对不对?这不,第三个特点就来了!

那么聪明的小伙伴呢,肯定已经知道我要讲什么了?对,没错!就是依赖注入,前面说了 Class 是一个设计图,但没说清楚,这个设计图呢,它只是一个小零件的设计图,但和真正的零件设计图还是有一些不一样的,比方说啊,它会告诉你它与另一个零件的关系,有了这个关系呢,工厂的作用就有了,工厂生产到一半,发现这个零件要加工好啊,还需要另一个零件,那它又转头去生产另一个零件(是不是非常不科学,不应该先批量生产出来,之后再一起组装吗?),生产好了呢,又回过来按设计图把另一个零件加到这个零件上去。如果生产另一个零件的时候发现,也依赖另外某个零件,那也照旧,先生产依赖的。这时候你肯定会说了,套娃就算了,万一你依赖我,我依赖你,那不无限套娃了吗?这个问题呢?有办法解决,但是这文章太短了,我写不下!(请叫我费马 · 心累)

最后说下容器的另一个特点,其实都是层层递进的,你甚至可以认为,只有一个特点,都行,看你怎么看!

这个特点呢就是插件 DIY!之前咱也说了,工厂呢,不搞生产,光做加工了,那这个加工过程啊,除了依赖注入啊,一些属性配置注入这样的通过配置的方式去影响对象,能不能开放一个接口,我想怎么 DIY,自己写代码来实现呢?当时是可以的啊!这样的接口呢,Spring 早就准备好了,您呢,只需要实现这个接口,写点代码,再把它放到容器里面去,工厂呢,就会在合适的时机执行你的代码。而且他这个接口呢,一共有好几个,每个接口呢,也好好几个方法,每个方法啊,都是代表了相应的时机。这时候你就要问了,这有什么用呢?别急,咋看看 Spring 怎么用的!(再多嘴一句啊,干预加工过程算什么,干预工厂本身才牛逼呢!我说的啥,懂得都懂!)

AOP

Spring 的 AOP 啊,终于说到了,其实呢,就是干预加工过程的一个产物!著名历史事件狸猫换太子大家都听过吧,AOP 呢,那是一模一样。著名的曹操挟天子以令诸侯都听过吧,AOP 呢,还是一模一样!

这两个呢,一个是说的 AOP 的实现原理,另一个说的,就是它的特点:把真正的对象当傀儡使!

咱先说说实现原理啊,其实也不难(请问这是第几遍?),工厂都被咱劫持了,加工的时候,得到成品了的时候,做一个壳子:代理对象,把真正的对象装进去,这样呢,有什么方法被调用,都是先到代理对象这里,代理对象呢,操纵着真正的对象,心情好了,就执行一下真正的对象对应的方法,得到劳动果实后呢,再返回出去,谁也不知道真正的对象。就好像光听着收音机,不知道的还以为声音都是收音机生产的,其实那就是个代理,真正创造声音的人,远在天涯呢!所以说啊,AOP 的特点是不是如我所言呢!

OK各位,这就是这期文章的全部内容啦,非常感谢你能看到这里,如果你觉得写的还不错的话,求赞,求收藏,求硬币(这啥玩意),求转发,最重要的是点个大大的关注!你的支持就是我做文章的最大动力!OK各位,我们下期再见!(动作指导:何同学)

下次一定