小马哥 spring 代码 小马哥spring编程思想_其他

前言

在拉勾教育Java高薪训练营再次学习了spring,再次感叹spring的核心思想。强调一下,IOC和AOP是一个技术思想(理论),并不是spring提出的,spring在技术层次把这两个思想做了⾮常好的实现(Java)。正是spring的优秀使得java繁荣起来,轻量,低耦合,简单,易扩展等。

什么是IOC

Inversion of Control (控制反转/反转控制),指的是关于对象的创建和管理的控制权反转了

  • 传统开发方式:自己在一个类中通过new得到另外一个类的实例对象
  • IOC思想:由外部环境实例化放到容器中(spring框架、IOC容器)

小马哥 spring 代码 小马哥spring编程思想_小马哥spring编程核心思想_02

那么控制反转有什么好处呢?

解耦:与接口编程同时使用时,依赖别人者不会因被依赖者改变而改变,达到了高度的松耦合

什么是AOP

OOP概念:面向对象程序设计(Object Oriented Programming)

AOP概念:⾯向切⾯编程( Aspect oriented Programming )

AOP是OOP的延续,从OOP说起,OOP是利用继承和多态来实现代码的复用,是一种垂直的复用。那么如果需要在每个方法中都需要加入前置和后置处理,比如事务管理,日志,权限等通用的代码该如何复用呢?即使是抽取了公共方法,仍然需要在每个方法的前后增加重复代码。也就是说要实现原有方法业务内容不变,前后进行增强的模式,也就是代理模式

小马哥 spring 代码 小马哥spring编程思想_AOP_03

于是横向方法重复逻辑代码被抽取,并且使得增加的逻辑和业务逻辑解耦。代理模式真的是好强大,使得你在写逻辑代码和调用的时候没有感知到我对其做了统一的增强。它是它,但它已经不是它了。。。

那AOP就是使用了动态代理模式来实现的。其中如果有实现接口就使用jdk动态代理,如果没有实现接口就使用cglib动态代理,这样说可能有些绕,实际上的这里理解实现接口是implements这个java关键字,这样结合代码就更容易理解了。

动态代理梳理

spring的aop动态代理有jdk和cglib两种实现方式,那么他们之间的区别是什么呢。首先我们应该来看如何实现代理。

我们如何实现代理

代理就是对原有方法进行增强,即改变方法的内容实现,那么如何改变原有方法?在java里可以通过重写Override来实现,那么有几种重写的思路:

  • 接口:原有方法实现了接口,我也写一个类实现接口,方法重写,在内容中回调原有方法,并在回调前后进行增强。
  • 继承:父类实现了方法,我编写一个子类重写父类的方法,同样在内容中回调原有方法(保证原有业务逻辑不变),并在回调前后进行增强。

小马哥 spring 代码 小马哥spring编程思想_AOP_04

也就是说可以有接口,也可以没有接口,这就是jdk动态代理和cglib动态代理的区别,就是动态代理的两种实现方案,当然还有其他的动态代理实现方案,其实现无非还是对原有方法的重写(只不过重写的时机方案不同),将重写部分在代理类中实现,当使用时返回的其实是代理类,就可以无感知的对所有方法进行横向增强,解决增强逻辑和业务实现的耦合问题。不得不说,代理模式真的是太强大了,在各个框架中,比如mybatis和spring均使用了动态代理和反射机制从而达到通用的实现。