Spring 中的 AOP 编程思想与实现
94 浏览量
更新于2024-08-28
收藏 103KB PDF 举报
Spring 中 AOP 个人总结
一、面向切面编程
面向切面编程(AOP)是一种横向的编程方式,横向是一种平行的意思。在 Spring 中,有很多的竖向的图,如 action 中会调用到 service,service 当中会调用到 dao,这样的类似一层一层的在 Spring 中认为是一种竖向编程,竖向编程结构清晰。横向编程类似于在 service 和 log 是两个模块,两者独立,但是在 service 调用的时候,希望能够通过 log 模块打印日志信息,我们将 log 当作一个切面横插进去,就是一种横向编程的思维。
二、AOP 相关概念
在 AOP 中,有一些重要的概念需要了解:
1. 关注点(Pointcuts):增加的某个业务,比如:日志、安全、缓存、事务等。
2. 切面(Aspect):一个关注点的模块。
3. 通知(Advice):在切面的某个特定的连接点上执行的动作,通知有前置通知、后置通知、返回通知、异常通知、环绕通知。
* 前置通知:发生在方法执行调用之前
* 返回通知:方法运行之后,得到结果返回后
* 后置通知:发生在返回通知之后
* 异常通知:运算异常才有的通知
* 环绕通知:可以得到上面所有的通知
4. 织入(Weaving):把切面连接道应用程序上,比如:把 log 连接到 service 上。
三、AOP 的好处
使用 AOP 有很多的好处,例如:
1. 真实角色处理的业务更加纯粹,不用去关注一些公共的事情(如:日志、安全、缓存等)。
2. 可以将公共的业务逻辑提取出来,独立于业务逻辑中。
3. 使得系统更加灵活、可扩展性强。
四、AOP 的实现
在 Spring 中,可以使用 AspectJ 库来实现 AOP。AspectJ 库提供了一个完整的 AOP 框架,可以轻松地实现 AOP。
五、代码实现
以下是一个简单的 AOP 实现代码:
首先,创建一个 ArithmeticCalculator 接口:
```java
package com.zhouning;
/
* @author zhouning
*/
public interface ArithmeticCalculator {
int add(int i, int j);
int sub(int i, int j);
int mul(int i, int j);
int div(int i, int j);
}
```
然后,创建一个 LogAspect 类,用于记录日志:
```java
package com.zhouning;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class LogAspect {
@Before("execution(* *(..))")
public void log(JoinPoint joinPoint) {
System.out.println("执行方法:" + joinPoint.getSignature().getName());
}
}
```
最后,在 Spring 配置文件中配置 AOP:
```xml
<aop:aspectj-autoproxy />
<bean id="arithmeticCalculator" class="com.zhouning.ArithmeticCalculatorImpl" />
<bean id="logAspect" class="com.zhouning.LogAspect" />
```
这样,当我们调用 ArithmeticCalculator 的方法时,LogAspect 将会记录日志。
2010-01-15 上传
2016-12-27 上传
2015-01-27 上传
点击了解资源详情
2019-07-30 上传
2013-10-23 上传
2018-06-11 上传
2020-09-03 上传
2011-06-19 上传
weixin_38622467
- 粉丝: 4
- 资源: 946
最新资源
- C语言数组操作:高度检查器编程实践
- 基于Swift开发的嘉定单车LBS iOS应用项目解析
- 钗头凤声乐表演的二度创作分析报告
- 分布式数据库特训营全套教程资料
- JavaScript开发者Robert Bindar的博客平台
- MATLAB投影寻踪代码教程及文件解压缩指南
- HTML5拖放实现的RPSLS游戏教程
- HT://Dig引擎接口,Ampoliros开源模块应用
- 全面探测服务器性能与PHP环境的iprober PHP探针v0.024
- 新版提醒应用v2:基于MongoDB的数据存储
- 《我的世界》东方大陆1.12.2材质包深度体验
- Hypercore Promisifier: JavaScript中的回调转换为Promise包装器
- 探索开源项目Artifice:Slyme脚本与技巧游戏
- Matlab机器人学习代码解析与笔记分享
- 查尔默斯大学计算物理作业HP2解析
- GitHub问题管理新工具:GIRA-crx插件介绍