IoC和AOP相对于Spring,就好比封装、继承和多态相对于Java而言,其重要性对于后端开发者来说是不言而喻的。还是那句话,理解比记忆更重要。

01、IoC(DI)

IoC(Inversion of Control),控制反转。IoC不是一种编程方法,而是一种编程思想。简单点说,就是把对象的创建过程交给spring IoC容器去管理。

以前,我们要在一个类中实例化另一个对象,都是使用类的构造方法来new一个对象,这个过程是由我们自己来控制的,而控制反转就把new对象的工作交给了Spring容器。

而IoC具体又是通过依赖注入(DI)来具体实现的。

依赖注入:由IoC容器动态地将某个对象所需要的外部资源(包括对象、资源、常量数据)注入到组件(Controller, Service等)之中。

IOC是思想层面,依赖注入是实现层面。

好处:

(1)降低组件之间的耦合性,实现软件各层之间的解耦。(类比齿轮啮合)

(2)降低业务对象替换的复杂性。

(3)使程序更加专注于自身的业务逻辑。

实现原理:Java反射机制

02、依赖注入的方式

Spring依赖注入的方式主要有四个,基于注解注入方式、set注入方式、构造器注入方式、静态工厂注入方式。推荐使用基于注解注入方式,配置较少,比较方便。

03、AOP

AOP就是面向切面编程,基于IOC,是对OOP的有效补充,AOP使用一种称为“横切”的技术,并将影响多个类的公共行为封装到可重用模块中,并将其命名为“Aspect”,即切面。

实际上,AOP把软件系统分为两个部分:核心关注点和横切关注点。

(1)核心关注点:核心业务逻辑,保留不动。

(2)横切关注点:共有功能比如权限认证、日志记录、事务处理等,被封装到一个可重用模块。

好处:

(1)减少系统的重复代码,降低模块间的耦合度。

(2)便于后期维护。

(3)使程序更加关注于自身的核心业务逻辑。

实现原理:JDK动态代理

04、AOP中的重要概念

(1)切面(Aspect):共有功能的实现。如权限认证、日志记录、事务处理等。在实际开发中通常是一个存放共有功能实现的标准Java类。当Java类使用了@Aspect注解修饰时,就能被AOP容器识别为切面。

(2)通知(Advice):切面的具体实现。就是要给目标对象织入的事情。以目标方法为参照点,根据放置的地方不同,可分为前置通知(Before)、后置通知(AfterReturning)、异常通知(AfterThrowing)、最终通知(After)与环绕通知(Around)5种。在实际开发中通常是切面类中的一个方法,具体属于哪类通知,通过方法上的注解区分。

(3)连接点(JoinPoint):程序在运行过程中能够插入切面的地点。例如,方法调用、异常抛出等。Spring只支持方法级的连接点。一个类的所有方法前、后、抛出异常时等都是连接点。

(4)切入点(Pointcut):用于定义通知应该切入到哪些连接点上。不同的通知通常需要切入到不同的连接点上,这种精准的匹配是由切入点的正则表达式来定义的。

比如,在上面所说的连接点的基础上,来定义切入点。我们有一个类,类里有10个方法,那就产生了几十个连接点。但是我们并不想在所有方法上都织入通知,我们只想让其中的几个方法,在调用之前检验下入参是否合法,那么就用切点来定义这几个方法,让切点来筛选连接点,选中我们想要的方法。切入点就是来定义哪些类里面的哪些方法会得到通知。

(5)目标对象(Target):那些即将切入切面的对象,也就是那些被通知的对象。这些对象专注业务本身的逻辑,所有的共有功能等待AOP容器的切入。

(6)代理对象(Proxy):将通知应用到目标对象之后被动态创建的对象。可以简单地理解为,代理对象的功能等于目标对象本身业务逻辑加上共有功能。代理对象对于使用者而言是透明的,是程序运行过程中的产物。目标对象被织入共有功能后产生的对象。

(7)织入(Weaving):将切面应用到目标对象从而创建一个新的代理对象的过程。这个过程可以发生在编译时、类加载时、运行时。Spring是在运行时完成织入,运行时织入通过Java语言的反射机制与动态代理机制来动态实现。

java的aop也是spring容器_java的aop也是spring容器