Spring系列__04AOP

今天来介绍一下AOP。AOP,中文常被翻译为“面向切面编程”,其作为OOP的扩展,其思想除了在Spring中得到了应用,也是不错的设计方法。通常情况下,一个软件系统,除了正常的业务逻辑代码,往往还有一些功能性的代码,比如:记录日志、数据校验等等。最原始的办法就是直接在你的业务逻辑代码中编写这些功能性代码,但是,这样除了当时开发的时候比较方便以外;代码的阅读性、可维护性都会大大降低。而且,当你需要频繁使用一个功能的时候(比如记录日志),你还需要重复编写。而使用AOP的好处,简单来说就是,它能把这种重复性的功能代码抽离出来,在需要的时候,通过动态代理技术,在不修改源代码的情况下提供增强性功能。
优势:

减少重复代码

提高开发效率

代码更加整洁,提高了可维护性
说了这么多,简单演示一下,我们假定有一个计算器对象,并能实现基本的加减乘除运算;同时,我们希望对相应的操作进行日志的记录。

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); }

在这里,我们定义了一个接口ArithmeticCalculator 来完成加减乘除运算,并将其具体实现交由其实现类完成。

public class ArithmeticCalculatorImpl implements ArithmeticCalculator { @Override public int add(int i, int j) { System.out.println(i + "和 " + j + "开始加法运算"); int reusult = i + j; System.out.println("加法运算结果是: " + reusult); return reusult; } @Override public int sub(int i, int j) { System.out.println(i + "和 " + j + "开始减法运算"); int reusult = i - j; System.out.println("减法运算结果是: " + reusult); return reusult; } @Override public int mul(int i, int j) { System.out.println(i + "和 " + j + "开始乘法运算"); int reusult = i * j; System.out.println("乘法运算结果是: " + reusult); return reusult; } @Override public int div(int i, int j) { if (j == 0) { throw new ArithmeticException("除数" + j + "不能为0"); } System.out.println(i + "和 " + j + "开始除法运算"); int reusult = i / j; System.out.println("除法运算结果是: " + reusult); return reusult; } }

在这里,我们看见了很恶心的代码:大量重复性的记录日志的代码,而且,当你更改的时候,你发现并不方便。后续我们会对这个代码进行改写。

AOP的实现方式

AOP通过动态代理的来实现。
在这里先简单介绍一下动态代理:使用一个代理将对象包装起来, 然后用该代理对象取代原始对象.。任何对原始对象的调用都要通过代理. 代理对象决定是否以及何时将方法调用转到原始对象上。其调用过程如下图所示:

Spring系列__04AOP

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwsxwy.html