SpringBoot AOP 与 IoC

时间:2021-08-02 05:00:42

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

SpringBoot AOP 与 IoC的更多相关文章

  1. 使用SpringBoot AOP 记录操作日志、异常日志

    平时我们在做项目时经常需要对一些重要功能操作记录日志,方便以后跟踪是谁在操作此功能:我们在操作某些功能时也有可能会发生异常,但是每次发生异常要定位原因我们都要到服务器去查询日志才能找到,而且也不能对发 ...

  2. SpringBoot AOP中JoinPoint的用法和通知切点表达式

    前言 上一篇文章讲解了springboot aop 初步完整的使用和整合 这一篇讲解他的接口方法和类 JoinPoint和ProceedingJoinPoint对象 JoinPoint对象封装了Spr ...

  3. AOP和IOC的作用

    IOC:控制反转,是一种设计模式.一层含义是控制权的转移:由传统的在程序中控制依赖转移到由容器来控制:第二层是依赖注入:将相互依赖的对象分离,在spring配置文件中描述他们的依赖关系.他们的依赖关系 ...

  4. AOP和IOC理解

    在百度上看到一篇很有意思的文章,是对AOP的一种解释,如下:(摘自:百度文库的 AOP和IOC最容易理解的说明(Spring知识小计)): IOC,依赖倒置的意思, 所谓依赖,从程序的角度看,就是比如 ...

  5. springboot+aop切点记录请求和响应信息

    本篇主要分享的是springboot中结合aop方式来记录请求参数和响应的数据信息:这里主要讲解两种切入点方式,一种方法切入,一种注解切入:首先创建个springboot测试工程并通过maven添加如 ...

  6. SpringBoot+AOP整合

    SpringBoot+AOP整合 https://blog.csdn.net/lmb55/article/details/82470388 https://www.cnblogs.com/onlyma ...

  7. springboot aop 不生效原因解决

    最近参照资料创建Springboot AOP ,结果运行后aop死活不生效. 查明原因: 是我在创建AOP类时选择了Aspect类型,创建后才把这个文件改为Class类型,导致一直不生效, 代码配置这 ...

  8. springboot aop 自定义注解方式实现完善日志记录(完整源码)

    版权声明:本文为博主原创文章,欢迎转载,转载请注明作者.原文超链接 一:功能简介 本文主要记录如何使用aop切面的方式来实现日志记录功能. 主要记录的信息有: 操作人,方法名,参数,运行时间,操作类型 ...

  9. springboot aop 自定义注解方式实现一套完善的日志记录(完整源码)

    https://www.cnblogs.com/wenjunwei/p/9639909.html https://blog.csdn.net/tyrant_800/article/details/78 ...

随机推荐

  1. 轻松自动化---selenium-webdriver(python) (八)

    本节重点: 调用js方法 execute_script(script, *args) 在当前窗口/框架 同步执行javaScript 脚本:JavaScript的执行. *参数:适用任何JavaScr ...

  2. java调用.net asmx / wcf

    一.先用asmx与wcf写二个.net web service: 1.1 asmx web服务:asmx-service.asmx.cs using System; using System.Coll ...

  3. Uniscribe文字自动换行

      转载:http://blog.csdn.net/jianlizhao66/article/details/1480457 我们获得了每个字形的宽度数组piAdvances,以及这个RUN所占用的总 ...

  4. 【BZOJ】1251: 序列终结者(splay)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1251 不行..为什么写个splay老是犯逗,这次又是null的mx没有赋值-maxlongint.. ...

  5. java使用.net的webservice

    1.下载最新的axis2 http://mirrors.hust.edu.cn/apache//axis/axis2/java/core/1.6.3/axis2-1.6.3-bin.zip 2.解压使 ...

  6. Oracle数据库用户数据完整备份与恢复

    使用PLSQL-Developer工具可以快速便捷地完成Oracle数据库用户.表的备份恢复. Oracle数据库用户数据完整备份与恢复 1. 备份 1.1   PL/SQL->工具->导 ...

  7. Python之父Guido在最近一次采访的最后说了啥

    Python之父Guido在最近一次采访的最后说了啥? 在前些天的一次采访中,被问到Python未来发展方向的时候原文在infoworld,咱们可爱的python老爹Guido是这样说的: One t ...

  8. PHP判断远程文件是否存在的几种方法

    在做一个图片预览中图的东西,遇到一个问题,就是要判断远程文件是否存在(不是同一台服务器). 代码如下: 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 ...

  9. 数位dp 模板

    不能有49 #include<bits/stdc++.h> using namespace std; //input by bxd #define rep(i,a,b) for(int i ...

  10. spark on yarn运行产生jar包冲突问题

    1.1 问题描述 Spark Streaming程序解析protobuf序列化的数据时,--jars 来添加依赖的protobuf-java-3.0.0.jar包,使用local模式程序正常,使用ya ...