我们知道spring的两个核心的组件就是ioc和aop,但是他最好的地方就是她的解耦和家族体系。
首先我们说一下见过最恶心的代码是什么(耦合度特别高的代码),而spring的作用就是解耦(降低代码之间的联系)。其中ioc和aop都可以用来解耦,ioc(控制反转)用于对象之间的解耦,aop(面向切面编程)用于业务之间的解耦。ioc最基本的技术就是“反射”编程,在oop(面向对象编程)的时候我们的底层实现是由N个对象实现的,每个对象之间就想齿轮一样相互依赖这样我们对象之间的耦合度就会特别的高,而在spring中引入了ioc的容器之后,我们每一个对象之间就跟ioc的这个容器相互依赖,大大减低了每个对象之间的耦合度。aop(面向切面编程)是对oop(面向对象编程)的一种扩充,aop利用的是一种”横切“(如果把对象比喻成一个空心圆柱体,圆柱体之间放的是对象的属性和行为。横切就好像是一把利刃,将这个空心圆柱体抛开获得里边的信息在将其复原,而这个切面就是Aspectj(方面))的技术。Aspectj就是将那些将那些影响了多个类的公共行为封装到一个可重用的模块并将其命名为“Aspectj”。Aspect就是将那些与业务无关但是却被代码模块重复调用的逻辑和责任封装起来,以便于减少系统的重复性代码,减低代码之间的耦合度,增加后期代码的可操作性和可维护性。
ioc就是控制反转,顾名思义就是将创建对象和分配对象的权利交予ioc的容器进行管理,具体的实现就是@Auto
aop就是面向切面编程他是一个从左到右的编程,oop(面向对象编程)他是一个从上到下的编程,aop的底层原理就是动态代理,动态代理分为JVM动态代理和cglib动态代理。其中JVM是基于接口实现目标类的代理对象进行增强(是基于内存java对象的增强),java默认的代理模式。cglib动态代理是基于目标类生成子类从而进行增强,是一种基于class字节码的增强技术。而这两种动态代理都需要对原目标类的方法进行增强。