一. 什么是 Spring AOP
关于什么是 Spring AOP. 当我翻到官方文档的时候也是一惊
Let us begin by defining some central AOP concepts and terminology. These terms are not Spring-specific… unfortunately, AOP terminology is not particularly intuitive; however, it would be even more confusing if Spring used its own terminology.
什么意思呢 ? 大概意思就是 Spring 官方说这些概念不是 Spring 独有的, 而是已经存在了的. 并且这些术语都不是很直观, 如果使用 SPring 自己的术语, 将会让人更加困惑.
当说到这的时候, 相信你已经知道了. 不是 Spring 特有的概念这不是关键, 主要的是连官方都说了 Spring AOP 的概念非常抽象, 理解起来会有一定的难度. 大致来看看到底什么是 SPring AOP, 它又到底是能做些什么 ?
1. Spring AOP 作用
现在无论是什么系统或者应用, 在使用之前都需要进行用户登陆验证. 除了登陆以及注册一面不需要验证以外, 其余功能基本都需要登陆才能使用. 因此想要完成这件事, 在之前我们是在所有需要验证的页面中通过 Controller 来登陆验证.
当你的功能越来越多之时, 你需要写的登陆验证也越来越多, 但是这些方法又是相同的, 会无故增加你很多代码修改和维护的成本. 那么如何将它单独抽离出来做成一个大家都能使用的功能, 让其他页面直接调用就能判定登录就是目前需要解决的.
在上面的基础之上, Spring AOP 的诞生就让其很好地进行了解决. 那么现在能解释什么是 Spring AOP 了吧 ?
AOP 是一种思想, Spring AOP 它是一种框架, 它提供了一种对 AOP 的具体实现. 类似于我们之前学的 Ioc 和 DI 之间的关系. 简单来说, AOP 干的是将某一个统一的功能集中处理.
统一的用户登录
统一的日志记录
统一的方法执行时间统计
统一的返回格式
统一的异常处理
统一的事务开启和提交
除了这些, 还有很多. 也就是说使用 AOP 可以扩充多个对象的某种能力. ( 张三、李四都具有相同的登陆能力等等 ).
2. AOP 的组成
2.1 Aspect 切面
什么是切面 ?
指的是横切多个类的一种模块. 在 Spring 中切面用的就是普通的类 ( XML 或者 @Aspect 注解配置 ). 这么一听好像很抽象, 比如我们刚刚说的登陆页面模块, 查看他人文章, 发布文章等等, 在执行自己对应的功能之前进行登录验证. 那么为了处理这个问题, 创建了一个普通类来集中处理. 而这个类就是切面.
这里的多个类就是执行对应的功能类, 而横切就是登陆. 把登陆创建成一个集中模块来处理就是切面.
2.2 Joint point
Joint Point : 连接点, 表示要横切的方法. 就是执行 AOP 功能的所有方法
例如上面登陆说的, 查看他人文章和发布文章的功能方法都是连接点.
2.3 Pointcut 切点
所谓的切点就是从哪里开始入手的意思. 也就是对于那些连接点起作用.
例如上面登陆说的, 可以从查看他人文章和发布文章这两个功能切入, 也就是定义的 AOP 只对这两个起作用, 而对于注册功能是不起作用的, 因为它不需要实现登录检验.
2.4 Advice 通知
通知, 是非常复杂的. 它里面定义了切面是什么, 什么时候使用. 描述了切面要完成的工作, 还解决什么时候执行这个工作的问题.
关于 Advice 通知它有很多类型, 可以在方法上使用一下注解, 会设置改方法为通知方法, 在满足条件以后会通知本方法进行调用
2.4.1 前置通知 : @Before
通知方法会在目标方法 ( 也就是连接点 ) 调用之前执行
2.4.2 后置通知 : @After
通知方法会在目标方法 ( 连接点 ) 调用之后执行.
PS : 无论连接点是正常结束还是异常结束都会执行
2.4.3 返回通知 : @AfterReturning
通知方法会在目标方法 ( 连接点 ) 返回之后调用
PS : 需要方法正常 return 并且没有抛出异常
2.4.4 异常通知 : @AfterThrowing
通知方法会在目标方法 ( 连接点 ) 异常之后调用
2.4.5 环绕通知 : @Around
通知包裹了被通知的方法, 在被通知的方法 ( 连接点 ) 通知之前和调用之后执行的自定义的行为