AOP 面向切面编程 笔记
基础概念
1.什么叫AOP
AOP即面向切面编程,是OOP编程思想的一种延续。利用AOP,我们可以对业务逻辑的各个模块进行隔离,从而使得业务逻辑的各个模块进行隔离,从而使得业务逻辑各个部分之间的耦合度降低,提高程序的可充用性,同时提高开发的效率。利用AOP,我们可以在无侵入状态下在宿主中插入一些代码。
常见的应用场景,比如日志埋点、性能监控、动态权限控制、代码调试等。
2.基础术语
-
Advice 增强
也叫“通知”。增强是织入到目标类连接点上的一段程序代码。结合执行点方位信息和切点信息,我们就可以找到特定的连接点。
-
JoinPoint 连接点
即程序执行的某个特定位置,如类开始初始化前、类初始化后、类中某个方法调用前、调用后、方法执行抛出异常后等。一个类或一段程序代码拥有一些具有边界性质的特定点,这些点中的特定点就成为“连接点”。连接点由两个信息确定:一是用方法表示的程序执行点;二是用相对点表示的方位。
- PointCut: 切点
也叫“切入点”。每个程序类都拥有多个连接点,如一个拥有两个方法的类,这两个方法都是连接点,即连接点是程序类中客观存在的事物。AOP通过“切点”来定位特定的连接点。连接点相当于数据库中的记录,而切点相当于查询条件。切点和连接点是一对多的关系。连接点是方法执行前、执行后等包括方位信息的具体程序执行点,而切点只定位到某个方法上,所以如果希望定位到具体连接点上,还需要提供方位信息。
- Aspect 切面
切面由切点和增强组成,它既包括了横切逻辑的定义,也包括了连接点的定义,它将切面所定义的横切逻辑织入到切面所制定的连接点中。
- Weaving 织入
织入是将增强添加到目标类具体连接点上的过程。根据不同的实现技术,AOP有三种不同的织入方式
1.编译期织入,这要求使用特殊的java编译器;
2.类装载期织入,这要求使用特殊的类装载器;
3.动态代理织入,在运行期为目标类添加增强生成子类的方式。
- Target 目标对象
增强逻辑的织入目标类。如果没有AOP,目标业务类需要自己实现所有的逻辑,而在AOP的帮助下,目标业务类只实现哪些非横切逻辑的程序逻辑,而性能监控和事务管理等横切逻辑则可以使用AOP动态织入到特定的连接点上。
AspectJ
上述主要讲了AOP的整体概念,理解起来还是相对晦涩的,接下来需要从实际的例子来结合起来看下。AspectJ实际上是对AOP编程思想的实现,它能够和java配合起来使用。下文将主要介绍下AspectJ是如何具体运用,他又是如何将AOP思想给体现出来的。
AspectJ注解
- @Aspect
该注解用来描述一个切面类。
定义切面类的时候需要加上这个注解,标明当前类是切面类。
-
@PointCut 切点表达式
-
@Before
-
@After
-
@Around
-
@AfterReturning
-
@AfterThrowing