ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Spring AOP 框架

2020-10-20 22:32:16  阅读:168  来源: 互联网

标签:框架 Spring 代理 切点 切面 AOP 注解


引言

要掌握 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,注解
来源: https://www.cnblogs.com/binbingg/p/13849552.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有