Spring AOP 基本概念 术语 容易理解

    • 举个栗子给大家讲一下代理:
  • 什么是AOP?
      • 基本术语
        • (1)切面(Aspect)
        • (2) 目标对象(Target)
        • (3) 连接点(JoinPoint)
        • (4) 切入点(PointCut)
        • (5) 通知(Advice)
        • (6) 织入(Weaving)
      • 静态代理模式
      • 动态代理模式
    • 代码实现
    • 自言自语

 Spring框架自诞生之日就拯救我等程序员于水火之中,它有两大法宝,一个是IoC控制反转,另一个便是AOP面向切面编程。今日我们就来破一下它的AOP法宝,以便以后也能自由使出一手AOP大法。

AOP全名Aspect-oriented programming面向切面编程大法,它有很多兄弟,分别是经常见的面向对象编程,朴素的面向过程编程和神秘的函数式编程等。所谓AOP的具体解释,以及和OOP的区别不清楚的同学可以自行去了解。

举个栗子给大家讲一下代理:

我相信大家都知道明星吧。

大部分明星是都有经纪人的。

假如我们是一个大厂,现在想要找一个明星代理产品,那我们会直接找到明星吗?不。
现实中,你大部分找到的都是找到明星的代理人(经纪人)。经纪人通过和你约谈,了解产品,看自己的家明星,是否可以接下这个广告。觉得可以,就会和你商量签订合同、商谈活动日期、排练等等。 虽然商家知道自己并没有找到明星,但是他却知道这件事情已经成了。

1、在这个流程中,商家找了明星的经纪人。但是却完成了最初的任务。
2、明星经纪人 帮明星签订合同、订下活动日期等等。
3、明星专注于拍广告。
这个时候我们是不是就可以讲 明星经纪人增强了明星的功能勒?
那么你喜欢哪个明星勒。

什么是AOP?

与OOP对比,AOP是处理一些横切行问题。这些横切性问题不会影响到主逻辑的实现,但是会散落到代码的各个部分,难以维护。AOP就是把这些问题和主业务逻辑分开,达到与主业务逻辑解耦的目的。

AOP是一种面向切面的编程思想。这些横切性问题,把它们抽象为一个切面,关注点在切面的编程,这就是所谓的AOP。

AOP关注点是横切性问题:

基本术语

(1)切面(Aspect)

  • 跨越多个类的关注点的模块化。事务管理是Java 应用程序中横切关注点的一个很好的例子。在 Spring AOP 中,方面是通过使用常规类(基于模式的方法)或使用@Aspect注解注解的常规类 (@AspectJ 风格)实现的。

切面是一个横切关注点的模块化,一个切面能够包含同一个类型的不同增强方法,比如说事务处理和日志处理可以理解为两个切面。切面由切入点和通知组成,它既包含了横切逻辑的定义,也包括了切入点的定义。 Spring AOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的连接点中。

可以简单地认为, 使用 @Aspect 注解的类就是切面

(2) 目标对象(Target)

目标对象指将要被增强的对象,即包含主业务逻辑的类对象。或者说是被一个或者多个切面所通知的对象。

(3) 连接点(JoinPoint)

程序执行过程中明确的点,如方法的调用或特定的异常被抛出。连接点由两个信息确定:

  • 方法(表示程序执行点,即在哪个目标方法)
  • 相对点(表示方位,即目标方法的什么位置,比如调用前,后等)

简单来说,连接点就是被拦截到的程序执行点,因为Spring只支持方法类型的连接点,所以在Spring中连接点就是被拦截到的方法。

讲人话 就是spring允许你使用通知的地方

(4) 切入点(PointCut)

上面说的连接点的基础上,来定义切入点,你的一个类里,有15个方法,那就有几十个连接点了对把,但是你并不想在所有方法附近都使用通知(使用叫织入,以后再说),你只想让其中的几个,在调用这几个方法之前,之后或者抛出异常时干点什么,那么就用切点来定义这几个方法,让切点来筛选连接点,选中那几个你想要的方法。

@Pointcut("execution(* com.remcarpediem.test.aop.service..*(..))")
public void pointcut() {
}

上边切入点的匹配规则是com.remcarpediem.test.aop.service包下的所有类的所有函数。

(5) 通知(Advice)

Spring AOP 包括以下类型的通知:

  • 前通知(Before advice):在连接点之前运行的通知,但没有能力阻止执行流继续到连接点(除非它抛出异常)。
  • 返回后通知(After returning advice):在连接点正常完成后运行的通知(例如,如果方法返回而没有抛出异常)。
  • 抛出异常通知后(After throwing advice):如果方法通过抛出异常退出,则运行通知。
  • After (finally) 通知(After (finally) advice):不管连接点退出的方式(正常或异常返回)都将运行的通知。
  • 环绕通知(Around advice):环绕连接点的通知,例如方法调用。这是最有力的建议。环绕通知可以在方法调用前后执行自定义行为。它还负责选择是继续连接点还是通过返回自己的返回值或抛出异常来缩短建议的方法执行。
// @Before说明这是一个前置通知,log函数中是要前置执行的代码,JoinPoint是连接点,
@Before("pointcut()")
public void log(JoinPoint joinPoint) {
}

(6) 织入(Weaving)

织入是将切面和业务逻辑对象连接起来, 并创建通知代理的过程。织入可以在编译时,类加载时和运行时完成。在编译时进行织入就是静态代理,而在运行时进行织入则是动态代理。

关键就是:切点定义了哪些连接点会得到通知

静态代理模式

所谓静态代理就是AOP框架会在编译阶段生成AOP代理类,因此也称为编译时增强。ApsectJ是静态代理的实现之一,也是最为流行的。静态代理由于在编译时就生成了代理类,效率相比动态代理要高一些。AspectJ可以单独使用,也可以和Spring结合使用。

动态代理模式

与静态代理不同,动态代理就是说AOP框架不会去修改编译时生成的字节码,而是在运行时在内存中生成一个AOP代理对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。

Spring AOP中的动态代理主要有两种方式:JDK动态代理和CGLIB动态代理。

JDK代理通过反射来处理被代理的类,并且要求被代理类必须实现一个接口。核心类是 InvocationHandler接口 和 Proxy类。
 而当目标类没有实现接口时,Spring AOP框架会使用CGLIB来动态代理目标类。
 CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成某个类的子类。CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。核心类是 MethodInterceptor 接口和Enhancer 类

代码实现

1、初识Spring-aop JDK动态代理实现
2、Spring-Aop-XML实现
3、Spring-Aop-注解实现

自言自语

又是一天。
课间休息放上一张好看的图。

Spring AOP(一) AOP基本概念相关推荐

  1. Spring AOP之HelloWorld与概念介绍(xml版)

    Spring AOP之HelloWorld与概念介绍 什么是AOP Spring AOP代码实现 Spring AOP 基本概念介绍 目标类 连接点 切入点 切面 切面类 通知 通知类别 织入 什么是 ...

  2. 8 -- 深入使用Spring -- 4...3 AOP的基本概念

    8.4.3 AOP的基本概念 AOP从程序运行角度考虑程序的流程,提取业务处理过程的切面.AOP面向的是程序运行中各个步骤,希望以更更好的方式来组合业务处理的各个步骤. AOP框架并不与特定的代码耦合 ...

  3. spring AoP学习 -----AoP的基本概念

    Aop的发展经理过两个阶段,第一个是静态Aop阶段,第二个是动态Aop阶段. 静态Aop阶段:作为第一代的Aop,以最初的AspectJ为代表,特点是以相应的横切关注点以Aspect形式实现之后,会通 ...

  4. Spring系列之AOP实现的两种方式

    Spring只支持XML方式而没有实现注解的方式(也叫AspectJ方式)的AOP,所以要使用@Aspect注解,只能引入AspectJ相关的 jar 包: aopalliance-1.0.jar 和 ...

  5. Spring源码-AOP(六)-自动代理与DefaultAdvisorAutoProxyCreator

    2019独角兽企业重金招聘Python工程师标准>>> Spring AOP 源码解析系列,建议大家按顺序阅读,欢迎讨论 Spring源码-AOP(一)-代理模式 Spring源码- ...

  6. 自己动手实现的 Spring IOC 和 AOP - 上篇

    1. 背景 我在大四实习的时候开始接触 J2EE 方面的开发工作,也是在同时期接触并学习 Spring 框架,到现在也有快有两年的时间了.不过之前没有仿写过 Spring IOC 和 AOP,只是宏观 ...

  7. Spring Boot 集成AOP

    在这里多谈一些关于AOP 方面的知识,如果你对AOP 方面的知识比较熟悉,可以直接略过这个段落,往下看. 一.AOP概述 AOP(面向切面编程) 概念:这种在运行时,动态地将代码切入到类的指定方法.指 ...

  8. 【Spring】Spring第二天 - AOP 详解、动态代理设计模式(JDK和cglib)

    一.AOP AOP 和 Filter 能够实现的 功能相似. AOP 和 Filter 的区别: AOP拦截的是类中方法(切点),只要方法能够被Spring管理,那么这个方法就能够被拦截. Filte ...

  9. Spring 中基于 AOP 的 XML操作方式

    Spring 框架的一个关键组件是面向方面的编程(AOP)框架.面向方面的编程需要把程序逻辑分解成不同的部分称为所谓的关注点.跨一个应用程序的多个点的功能被称为横切关注点,这些横切关注点在概念上独立于 ...

最新文章

  1. 10个JavaScript难点
  2. [剑指offer][JAVA]面试题第[32-3]题[从上到下打印二叉树 ][BFS]
  3. *【CodeForces - 574A】Bear and Elections (优先队列,水题模拟)
  4. sublime-编辑器的使用-基本
  5. C++中的错误处理方法(含示例代码)
  6. java jlabe_[求助]JPanel上怎么移除JLabe。l
  7. 《项目百态:软件项目管理面面观》三模式总结
  8. A water problem (hdu-5832)
  9. 澳大利亚计算机领域的科学家,澳科学家首创硅基元件 突破量子计算机制造瓶颈...
  10. CCF201903-2 二十四点(100分)【表达式计算】
  11. 爪哇国新游记之二十----将数字转换成中国汉字大写形式
  12. Oracle高级查询之GROUP BY
  13. 女神节福利:友萌君送你~健身踏青装备
  14. 正整数变成英文输出c语言,C语言,输入一个正整数,然后从个位开始一次输出每一位数字对应的英文字母...
  15. linux iio 设备驱动,Linux设备驱动之IIO子系统——IIO框架数据读取,linuxiio
  16. Excel中数据透视表的使用(一)
  17. vue组件内容不显示
  18. UNRAID挂载exFat格式的USB磁盘
  19. 前端判断文件后缀名_js判断上传文件后缀名是否合法
  20. 计算机3d 游戏制作,揭秘3D电影、游戏角色的制作过程!

热门文章

  1. SAP SM12 解锁Lock Table
  2. SAP: ALV的布局管理
  3. 还想“躺着挣钱”?这家背靠世界500强的工程机械企业如何做?
  4. FILA之后又有Amer,安踏能成为“世界的安踏”吗?
  5. 什么时候出python4_Python4要来了?快来看看Python之父怎么说
  6. python怎么处理数据_python panda怎么处理数据
  7. 怎么看电脑电源多少w_电脑电源怎么测试通电
  8. mysql远程服务器返回错误404未找到_远程服务器返回错误: 404错误、远程服务器返回错误:500错误、 HttpWebResponse远程服务器返回错误:(404、500) 错误。...
  9. 计算机负数用英语怎么说,负数在计算机中如何表示
  10. java 自助更改密码 api_搭建ldap自助修改密码系统--Self Service Password