引言

要掌握 Spring AOP 框架,需要弄明白 AOP 的概念。

AOP 概念

AOP(Aspect Oriented Programming的缩写,翻译为面向方面或面向切面编程),通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。利用 AOP 可以对业务逻辑的各个部分隔离,从而使的业务逻辑各部分的耦合性降低,提高程序的可重用性,踢开开发效率,使用 AOP 技术可以实现的主要功能有日志记录,性能统计,安全控制,事务处理,异常处理等。

AOP 技术的底层实现原理是 JDK 动态代理和 CGLIB 动态代理。这两种动态代理的区别是 JDK 动态代理必须实现接口,而 CGLIB 直接操纵字节码,可以做到不使用接口的情况下实现动态代理。

AOP 与 OOP 区别

OOP面向对象编程,针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。而 AOP 则是针对业务处理过程中的切面进行提取,它所面对的是处理过程的某个步骤或阶段,以获得逻辑过程的中各部分之间低耦合的隔离效果。这两种设计思想在目标上有着本质的差异。

AOP 术语

  • 连接点(Joinpoint)

    AOP 插入代码的特定位置(方法调用前、方法调用后、方法调用前后、抛出异常)

  • 切点(Pointcut)

    AOP 定位或查找连接点的方式(一个切点可以匹配多个连接点)

  • 增强(Advice)

    AOP 插入到连接点的一段程序代码(前置增强、后置增强、环绕增强和抛出异常增加)

  • 引介(Introduction)

    特殊的增强(可以为类添加一些属性和方法)

  • 织入(Weaving)

    插入代码的过程(AOP 有三种织入方式:编译器织入、类装载期织入、动态代理织入)

  • 切面(Aspect)

    由切点和增强或引介组成(Spring AOP 是负责实施切面的框架)

Spring AOP 框架

Spring AOP 是使用纯 Java 实现 AOP,它不需要专门的编译过程,也不需要特殊的类装载器,它在运行期通过代理的方式向目标类织入增强代码。Spring AOP 使用了两种代理机制:JDK 动态代理和CGLib 动态代理,它们是 Spring AOP 底层技术。

Spring AOP 支持两种使用方式:

  • 基于 XML 配置文件

  • 基于注解

注解

<!– 开启 AOP 注解开关 -->
<aop:aspectj-autoproxy />
  • @Aspect 注解:放置于切面类上,用于注解定义一个切面

  • @Before 注解:放置于切面类方法上,用于注解实现前置增强

  • @After 注解:放置于切面类方法上,用于注解实现后置增强

  • @Around 注解:放置于切面类方法上,用于注解实现环绕增强

  • @AfterThrowing 注解:放置于切面类方法上,用于注解实现抛出异常增强

切点表达式

**切点表达式 = execution(返回值类型 + 包名 + 类名 + 方法名 + 参数个数) **

切点表达式支持三个通配符:

  • 符号(*) :代表任意字符,匹配上下文中的一个元素

  • 符号(..):代表任意字符,可以代表多个元素,但是在表示类的时候不能单独使用,必须和 * 配合;在代表形参的时候可以单独使用

  • 符号(+):代表按类型匹配指定类的所有类(包括子类),只能跟在类名的后面

举例:

execution(* com.dt..Dog.b(..))

该切点表达式表示匹配 1)方法的任意类型返回值,2)方法必须是 com.dt 所在包 3)类名必须为Dog 4)方法名必须以字母 b 开头 5)方法参数个数不限

总结

AOP 可以通过预编译方式和运行期动态代理实现在不修改源码的情况下,给程序动态统一添加功能的一项技术。

Spring AOP 框架的更多相关文章

  1. Spring AOP框架 AspectJ

    1 AspectJ简介 v  AspectJ是一个基于Java语言的AOP框架 v  Spring2.0以后新增了对AspectJ切点表达式支持 v  @AspectJ 是AspectJ1.5新增功能 ...

  2. Spring/AOP框架, 以及使用注解

    1, 使用代理增加日志, 也是基于最原始的办法 import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; ...

  3. Spring aop框架使用的jar包

    除了前两个jar包,后面的jar包spring框架包中都有,前两个jar包的下载地址:https://pan.baidu.com/s/1L-GLGT1c8vnwFwqLxzzZuw

  4. Spring aop的实现原理

    简介 前段时间写的java设计模式--代理模式,最近在看Spring Aop的时候,觉得于代理模式应该有密切的联系,于是决定了解下Spring Aop的实现原理. 说起AOP就不得不说下OOP了,OO ...

  5. Spring AOP 实现原理与 CGLIB 应用

    https://www.ibm.com/developerworks/cn/java/j-lo-springaopcglib/ AOP(Aspect Orient Programming),也就是面向 ...

  6. Spring AOP: Spring之面向方面编程

    Spring AOP: Spring之面向方面编程 面向方面编程 (AOP) 提供从另一个角度来考虑程序结构以完善面向对象编程(OOP). 面向对象将应用程序分解成 各个层次的对象,而AOP将程序分解 ...

  7. Spring AOP 实现原理与 CGLIB 应用--转

    AOP(Aspect Orient Programming),作为面向对象编程的一种补充,广泛应用于处理一些具有横切性质的系统级服务,如事务管理.安全检查.缓存.对象池管理等.AOP 实现的关键就在于 ...

  8. spring AOP 之二:@AspectJ注解的3种配置

    @AspectJ相关文章 <spring AOP 之二:@AspectJ注解的3种配置> <spring AOP 之三:使用@AspectJ定义切入点> <spring ...

  9. Spring学习(十八)----- Spring AOP+AspectJ注解实例

    我们将向你展示如何将AspectJ注解集成到Spring AOP框架.在这个Spring AOP+ AspectJ 示例中,让您轻松实现拦截方法. 常见AspectJ的注解: @Before – 方法 ...

随机推荐

  1. Day11_58_增强for循环

    增强for循环 * 语法 : for(数据类型 变量名:数组名/集合名) * 集合如果要使用增强for循环需要先使用泛型来确定元素类型,如果没有使用泛型就使用foreach,那么变量类型设置为Obje ...

  2. Day05_22_实例化对象的JVM内存分析

    创建对象的 JVM 内存分析 *new 运算符的作用是创建对象,在JVM堆内存中开辟新的内存空间 *方法区内存:在类加载的时候,class字节码文件被加载到该内存空间当中 *栈内存(局部变量):方法代 ...

  3. 【cypress】5. 测试本地web应用

    在之前的cypress介绍里曾提到过,cypress虽然也可以测试部署好的应用,但是它最大的能力还是发挥在测试本地应用上. 本章主要内容就是关于如何测试本地web应用的概述: cypress与后台应用 ...

  4. Access数据库及注入方法

    目录 Access数据库 Access数据库中的函数 盲注Access数据库 Sqlmap注入Access数据库 Access数据库 Microsoft Office Access是由微软发布的关系数 ...

  5. CreateThread 线程操作与 _beginthreadex 线程安全(Windows核心编程)

    0x01 线程的创建 线程不同于进程,Windows 中的进程是拥有 '惰性' 的,本身并不执行任何代码,而执行代码的任务转交给主线程,列如使用 CreateProcess 创建一个进程打开 Cmd ...

  6. Jenkins反序列化漏洞复现

    Jenkins Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能. Jenkins功能包括: 持 ...

  7. CTFHub-技能树-SSRF

    SSRF 目录 SSRF 1.内网访问 2.伪协议读取文件 3.端口扫描 4.POST请求 5.上传文件 6.FastCGI协议 7.Redis 8.URL Bypass 9.数字IP Bypass ...

  8. 如何在C艹大作业上用复数计算器拿下一个100分

    0. qt qt简介: 百度百科 下载:官网下载 申请个账号就可以免费用了 安装方式可以在百度上找到,建议安装MinGW,其余自选. 1. 建立第一个qt文件 打开Qt Creator,点击文件,点击 ...

  9. ArrayList初步使用

    ️Practice the usage of ArrayList all of String with a exampe of NoteBook. ArrayList all of String的部分 ...

  10. SQL注入,PreparedStatement和Statement

    代码区 还是一个工具类 代码: package cn.itcats.jdbc; import java.sql.Connection;import java.sql.DriverManager;imp ...