一只菜鸟攻城狮啊

一只菜鸟攻城狮啊

AOP简介

今天来介绍一下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-LMLPHP

09-17 04:48