Spring 中的 AOP 编程思想与实现

0 下载量 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 将会记录日志。