引言

要掌握 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 可以通过预编译方式和运行期动态代理实现在不修改源码的情况下,给程序动态统一添加功能的一项技术。

最新文章

  1. CSS3系列之3D制作
  2. MongoDB安装、管理工具、操作
  3. .NET设计模式(7):创建型模式专题总结(Creational Pattern)(转)
  4. python中的 @ 修饰符
  5. Oracle的学习一:安装与卸载、sql *plus常用命令、Oracle用户管理
  6. hdu 4751
  7. HDOJ 1236 排名(练耐心题)
  8. 使用WCF实现SOA面向服务编程—— 架构设计
  9. Stimulsoft.Report.net报表简单实用
  10. Python Opencv安装环境搭建
  11. vue---checkbox,获取选中的值
  12. 剥开比原看代码08:比原的Dashboard是怎么做出来的?
  13. hasura graphql-engine &amp;&amp;patroni docker-compose 环境运行
  14. linux解决病毒系列之一,删除十字符libudev.so病毒文件
  15. 【LLVM笔记】0x00 初识LLVM 链接类型
  16. R包下载的一些小问题
  17. C++ STL 教程
  18. matlab中的决策树
  19. asp.net 设计条码code 11的问题
  20. Ubuntu 下 CodeBlocks 修改用户自定义颜色主题 及 更新CodeBlocks到最新版本

热门文章

  1. 一键生成dotnet5项目解决方案
  2. 10. Vue-Vue 的{{}}、v-html、v-text
  3. Nginx 配置浏览Linux 系统目录并下载文件
  4. Vue method与computed的区别
  5. hdu4756 最小树+树形dp
  6. hdu4179 限制最短路
  7. POJ2536 二分图匹配
  8. hdu4784 不错的搜索( 买卖盐,要求整钱最多)
  9. Windows Pe 第三章 PE头文件(下)
  10. jQuery数组($.grep,$.each,$.inArray,$.map)处理函数详解