目录
1、引用AOP原因
介绍AOP之前,我们首先来了解什么是OOP,OOP(Object Oriented Programming)既面向对象编程,所谓面向对象就是基于对象概念,以对象为中心,以类和继承为构造机制,来认识、理解、刻画客观世界和设计、构建相应的软件系统。其引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟对象公共行为的一个集合。
当我们需要分散对象的公共行为时,OOP就并不是很好的选择,OOP虽然可以实现,但代码大量复用。例如记录日志功能,在所有对象层次中往往水平存在日志代码,而日志代码与对象的核心功能不会发生直接的关系。又如安全控制、事务管理、异常处理等也是如此,这种水平分布在各处的、与核心功能无关的代码被称为切面。这些代码会散落穿插在各个业务逻辑中,非常冗余且不利于维护,因此引用AOP。
2、什么是AOP
SpringAOP的全称是Aspect Oriented Programming,是一种编程思想,是对OOP的补充和完善,可以进一步提高开发效率。在AOP中,Aspect的含义更多的理解为“切面”比较合适,因此也称之为面向切面编程。传统架构是至上而下的,后期想要从中间切入写代码添加功能,比如记录日志、事务管理、异常处理等,这时候我们就需要AOP专门把这些代码给抽象了出来。
3、AOP优点
- 减少重复代码
- 提高开发效率
- 代码简洁
- 维护方便且高效
4、AOP应用场景
- 日志记录
- 事务控制(调用方法前开启事务, 调用方法后提交关闭事务 )
- 权限检查(例如SpringSecurity)
- 检测方法运行时间
- 数据源代理
- 缓存优化 (第一次调用查询数据库,将查询结果放入内存对象, 第二次调用, 直接从内存对象返回,不需要查询数据库 )
5、AOP实现方式
- JDK动态代理
java提供动态代理技术,可以在运行时创建接口的代理实例。SpringAOP默认采用这种方式,在接口的代理实例中织入代码。(基于接口的动态代理技术)
- CGLib动态代理
采用底层的字节码技术,在运行时创建子类代理实例,当目标对象不存在接口时,SpringAOP会采用这种方式在子类实例中织入代码。(基于父类的动态代理技术)
6、AOP基本术语
6.1 Joinpoint(连接点)
所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring 只支持方法类型的连接点
6.2 Pointcut(切入点)
所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义。
6.3 Advice(通知/增强)
所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知。通知的类型:前置通知,后置通知,异常通知,最终抛出通知,环绕通知。
通知的配置语法:
<aop:通知类型 method=“切面类中方法名” pointcut=“切点表达式"></aop:通知类型>
名称 | 标签 | 说明 |
前置通知 | <aop:before> | 指定增强的方法在切入点之前执行 |
后置通知 | <aop:after-returning> | 指定增强的方法在切入点之后执行 |
环绕通知 | <aop:aroud> | 指定增强的方法在切入点之前和之后都执行 |
异常抛出通知 | <aop:throwing> | 指定增强的方法在出现异常时执行 |
最终通知 | <aop:after> | 无论增强的方式执行是否有异常都会执行 |
6.4 Introduction(引介)
引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或 Field。
6.5 Target(目标对象)
代理的目标对象
6.6 Weaving(织入)
是指把增强应用到目标对象来创建新的代理对象的过程。spring 采用动态代理织入,而 AspectJ 采用编译期织入和类装载期织入。
6.7 Proxy(代理)
一个类被 AOP 织入增强后,就产生一个结果代理类。
6.8 Aspect(切面)
是切入点和通知(引介)的结合。