AspectJ实现AOP
AOP 是面向切面编程的编程思想,AOP 解决日志、权限等于横切性问题,将这些问题与主业务逻辑分开,达到与主业务逻辑结构的目的。
当我们在编写程序的时候,需要完成一些与核心业务逻辑无关的功能。比如说日志功能、权限校验功能。这些操作与对象的核心功能无关,并且散落在各种业务逻辑之中。我们将日志、权限控制这样的功能抽离成独立的切面,并在程序中设置连接点使用这些功能,这就是 AOP 的思想。
AOP 概念是 OOP(Object Oriented Programming) 概念的补充,我们使用面向对象的思想将程序的操作单位从函数变成了对象。但是面向对象的思想,面对与对象的核心功能无关的操作时显得很无力。AOP 的思想就能很优雅地处理这些散落在业务代码中的功能。
总的来说 OOP 思想关注纵向的业务逻辑,AOP 思想关注横向的功能扩展。两者相辅相成,互为补充。
补充:廖雪峰的教程中,关于 OOP 的描述,有一些比较经典。
OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。
而面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。
… 面向对象的抽象程度又比函数要高,因为一个Class既包含数据,又包含操作数据的方法。
AOP 的应用场景
- 日志记录
- 权限验证
- 效率检查
- 事务管理
- exception
Spring Aop 和 AspectJ 的关系
AOP 是一种概念
Spring Aop、AspectJ 都是 AOP 思想的具体实现,Spring Aop有自己的语法,但是语法复杂,所以 Spring Aop 借助了AspectJ的注解,但是底层实现还是自己的。
Spring AOP 提供两种编程风格:
- 利用 aspectj 的注解@AspectJ support
- xml aop:config 命名空间,Schema-based AOP support
本文第一章节演示的就是基于注解的方式。
AOP 相关概念
- Aspect: 切面,
@Componet
、@Aspect
注解的类 - Pointcut: 切点,是连接点(JoinPoint)的集合,是一个方法
- Joinpoint: 连接点,目标对象的方法,也就是我们需要关注和增强的方法
@Pointcut("execution(* *..test*())")
- Advice:通知,位置 + 逻辑
- Introduction:
- Target object:目标对象,原始对象,区别于经过 AOP 增强的对象
- AOP prox:代理对象,包含了原始对象的代码和增加后的代码的那个对象
- Weaving:织入,把代理逻辑加入到目标对象上的过程叫做织入
@AspectJ 实战 AOP
|
|