简介
- Spring 框架的关键组件是 面向切面的编程(AOP,Aspect Oriented Programming),面向切面的编程需要把程序逻辑分解成不同的部分称为所谓的连接点。跨一个应用程序的多个点的功能被称为切入点,切入点在概念上独立于应用程序的业务逻辑。有各种各样的常见的很好的方面的例子,如日志记录、审计、声明式事务、安全性和缓存等。
 - 在 面向对象编程(OOP,Object Oriented Programming) 中,关键单元模块度是类,而在 AOP 中单元模块度是方面。依赖注入帮助你对应用程序对象相互解耦和 AOP 可以帮助你从它们所影响的对象中对切入点解耦。AOP 是像编程语言的触发物,如 Perl,.NET,Java 或者其他。
 - Spring AOP 模块提供拦截器来拦截一个应用程序,例如,当执行一个方法时,你可以在方法执行之前或之后添加额外的功能。
 
AOP
术语
- 在我们开始使用 AOP 工作之前,让我们熟悉一下 AOP 概念和术语。这些术语并不特定于 Spring,而是与 AOP 有关的。
 
| 项 | 描述 | 
|---|---|
| Aspect(切面) | 由一系列切点、增强和引入组成的模块对象。 | 
| Join point(连接点) | 程序执行期的一个点。 | 
| Pointcut(切入点) | 一组通过表达式从连接点中被筛选出来的点。 | 
| Advice(通知) | 切面在特定接入点的执行动作。 | 
| Introduction(引入) | 为某个type声明额外的方法和字段。 | 
| Target object(目标对象) | 一个被一个或者多个切面所通知的被代理对象。 | 
| Weaving(织入) | 把切面连接到其它的对象上,并创建目标对象。 | 
通知
- Spring AOP 模块可以使用下面提到的五种通知工作:
 
| 通知 | 描述 | 
|---|---|
| 前置通知(before) | 在切入点方法执行之前,执行通知。 | 
| 后置通知(after-returning) | 在切入点方法执行之后,当方法正常执行时,执行通知。 | 
| 异常通知(after-throwing) | 在切入点方法执行之后,当方法抛出异常时,执行通知。 | 
| 最终通知(after) | 在切入点方法执行之后,不考虑其结果,执行通知。 | 
| 环绕通知(around) | 在建议方法调用之前和之后,执行通知。 | 
目录结构
src
main
- java
- anno
- Student.java(目标类)
 - Logger.java(通知类)
 
 - xml
- Student.java(目标类)
 - Logger.java(通知类)
 
 
 - anno
 - resources
- anno
- Beans.xml(Spring配置文件)
 
 
 - anno
 
- java
 test
- anno
- SpringTest.java(测试类)
 
 - xml
- SpringTest.java(测试类)
 
 
- anno
 
基于xml
Student.java
1  | package OtherAdvice.xml;  | 
Logger.java
1  | package OtherAdvice.xml;  | 
Beans.xml
1  | 
  | 
SpringTest.java
1  | package cn.water.test.OtherAdvice.xml;  | 
基于注解
Student.java
1  | package OtherAdvice.anno;  | 
Logger.java
1  | package OtherAdvice.anno;  | 
Beans.xml
1  | 
  | 
SpringTest.java
1  | package cn.water.test.OtherAdvice.anno;  | 
四大通知
基于xml
通知类
1  | /** 环绕通知 */  | 
配置文件
- 添加AOP框架
- aop:aspect:切面
- aop:pointcut:切入点
- aop:around:环绕方法
 
 
 - aop:pointcut:切入点
 
 - aop:aspect:切面
 
1  | <!-- Spring AOP框架 -->  | 
运行结果
1  | ------  | 
基于注解
通知类
- 添加注解
- @Aspect:切面
- @Pointcut:切入点
- @Before:前置方法
 - @AfterReturning:后置方法
 - @AfterThrowing:异常方法
 - @After:最终方法
 
 
 - @Pointcut:切入点
 
 - @Aspect:切面
 
1  | 
  | 
配置文件
- 开启注解支持
 
1  | <aop:aspectj-autoproxy/>  | 
运行结果
- 运行顺序有误!!!
 
1  | ------  | 
环绕通知
基于xml
通知类
1  | /** 前置通知 */  | 
配置文件
- 添加AOP框架
- aop:aspect:切面
- aop:pointcut:切入点
- aop:before:前置方法
 - aop:afterReturning:后置方法
 - aop:afterThrowing:异常方法
 - aop:after:最终方法
 
 
 - aop:pointcut:切入点
 
 - aop:aspect:切面
 
1  | <!-- Spring AOP框架 -->  | 
运行结果
1  | ------  | 
基于注解
通知类
- 添加注解
- @Aspect:切面
- @Pointcut:切入点
- @Before:前置方法
 - @AfterReturning:后置方法
 - @AfterThrowing:异常方法
 - @After:最终方法
 
 
 - @Pointcut:切入点
 
 - @Aspect:切面
 
1  | 
  | 
配置文件
- 开启注解支持
 
1  | <aop:aspectj-autoproxy/>  | 
运行结果
1  | ------  |