SpringBoot AOP 与 IoC

Spring的核心就是AOP与IoC,想要学习SpringBoot,首先得理解这些概念:

AOP(Aspect Oriented Programming 面向切面编程)

IoC(Inversion of Control 控制反转)

DI(Dependency Injection 依赖注入)

AOP是什么

非常简单易懂的AOP文章:https://www.cnblogs.com/Wolfmanlq/p/6036019.html

AOP - Aspect Oriented Programming(面向切面)是一种编程范式,算是一个比较热门的话题,以至于有一种论调说“AOP会替代OOP”,然而事实上AOP跟OOP的关注点并不相同。面向对象(OOP)的目的在于抽象 ,而面向切面(AOP)的目的在于解耦。

在Java中面向切面编程需要使用反射(动态代理)实现,操作比较麻烦。而在Python语言中则提供了一个很好用的语法糖–装饰器.

AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。其与设计模式完成的任务差不多,是提供另一种角度来思考程序的结构,来弥补面向对象编程的不足。例如:针对某些业务逻辑 添加日志、权限、事务等功能。

比如,若是需要一个记录日志的功能,首先想到的是在方法中通过log4j或其他框架来进行记录日志,但写下来发现一个问题,在整个业务中其实核心的业务代码并没有多少,都是一些记录日志或其他辅助性的一些代码。而且很多业务有需要相同的功能,比如都需要记录日志,这时候又需要将这些记录日志的功能复制一遍,即使是封装成框架,也是需要调用之类的,在此处使用复杂的设计模式又得不偿失。

因此就需要面向切面出场了!!!

Aop 常用术语

切面(Aspect):

一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。在Spring AOP中,切面可以使用基于模式或者基于@Aspect注解的方式来实现。

连接点(Joinpoint):

在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。在Spring AOP中,一个连接点总是表示一个方法的执行。

通知(Advice):

在切面的某个特定的连接点上执行的动作。其中包括了“around”、“before”和“after”等不同类型的通知(通知的类型将在后面部分进行讨论)。许多AOP框架(包括Spring)都是以拦截器做通知模型,并维护一个以连接点为中心的拦截器链。

切入点(Pointcut):

匹配连接点的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。

引入(Introduction):

用来给一个类型声明额外的方法或属性(也被称为连接类型声明(inter-type declaration))。Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。例如,你可以使用引入来使一个bean实现IsModified接口,以便简化缓存机制。

目标对象(Target Object):

被一个或者多个切面所通知的对象。也被称做被通知(advised)对象。既然Spring AOP是通过运行时代理实现的,这个对象永远是一个被代理(proxied)对象。

AOP代理(AOP Proxy):

AOP框架创建的对象,用来实现切面契约(例如通知方法执行等等)。在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。

织入(Weaving):

把切面连接到其它的应用程序类型或者对象上,并创建一个被通知的对象。这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。

IoC是什么

IoC - Inversion of Control 控制反转,它不是一种技术,而是一种设计思想。

Java程序中的每个业务逻辑至少需要两个或以上的对象来协作完成,通常每个对象在使用它的合作对象时,自己需要通过new object() 这样的语法来完成合作对象的初始化工作,这就会使得:对象间的耦合度加深。

Spring IOC的思想是:Spring容器来实现这些相互依赖对象的创建、协调、管理和销毁工作,对象只需要关注业务逻辑本就可以了,而不是传统的在你的对象内部直接控制。;也就可以被称之为:对象如何得到它的合作对象的责任被反转了(IOC/DI)。

DI其实是IOC的另外一种说法,DI是由Martin Fowler 在2004年初的一篇论文中首次提出的。他总结:控制的什么被反转了?就是:获得依赖对象的方式反转了。

Spring所倡导的开发方式是:所有的类都会在Spring容器中登记,告诉Spring你是个什么东西?你需要什么东西?然后Spring会在系统运行到适当的时候,自动把你要的东西主动给你(而不是在一开始实例化所有对象,从而提高的性能)。所有类的创建、销毁都由Spring来控制,也就是说控制对象生命周期的不再是引用他的对象,而是Spring。对于某个具体的对象来说,以前是它自己去控制其他对象;现在是所有对象都由Spring来控制,这就叫IOC/DI(控制反转 或 依赖注入)。

IOC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象,这一点是通过DI(Dependency Injection)来实现的。

例如 对象A需要操作数据库对象,以前需要在A中自己编写代码来获得一个Connection对象;有了Spring后,我们只需要告诉Spring,A中需要一个Connection对象,至于这个Connection如何构造,何时构造,A不关心也不需要知道。在系统运行时,Spring会在适当的时候制造一个Connection对象,然后像打针一样,自动注射到A对象当中,这样就完成了对各对象之间关系的控制。

那么DI是如何实现的呢?在Java1.3之后有一个非常重要的特性 Reflection(反射),它允许程序在运行时动态的生成对象、执行对象的方法、改变对象的属性,Spring就是通过反射来实现自动注入的。

Spring IOC管理的对象,我们称之为Bean对象,Bean对象就是Spring容器初始化、装配、管理的对象;除此之外,Bean对象与程序中的其他对象没有什么区别,那IOC是如何实例化Bean、管理Bean之间的依赖关系呢?答案是: 通过Annotation或XML配置文件来实现手动或自动装配Bean。

参考文章:
https://blog.csdn.net/happydecai/article/details/79972744
https://blog.csdn.net/jiangyu1013/article/details/72654373
https://blog.csdn.net/zhaoyanjun6/article/details/80669022

原文地址:https://www.cnblogs.com/vincenshen/p/10427859.html