AOP前奏

AOP前奏 项目Note2

1.动态代理模式

动态代理模式:使用一个代理将对象包装起来,然后用该代理对象获取原始对象,任何对原始对象的调用都通过代理,代理对象觉得是否将方法调用转移到原始对象上。

Java代码:

AtithmeticCalculator.java

public interface AtithmeticCalculator {
    int add(int i, int j);

    int sub(int i, int j);

    int mul(int i, int j);

    int div(int i, int j);
}

AtithmeticCalculatorImpl.java

public class AtithmeticCalculatorImpl implements AtithmeticCalculator {
    @Override
    public int add(int i, int j) {
        int result = i + j;
        return result;
    }

    @Override
    public int sub(int i, int j) {
        int result = i - j;
        return result;
    }

    @Override
    public int mul(int i, int j) {
        int result = i * j;
        return result;
    }

    @Override
    public int div(int i, int j) {
        int result = i / j;
        return result;
    }
}

AtithmeticCalculatorLogginProxy.java:代理类

public class AtithmeticCalculatorLogginProxy {
    private AtithmeticCalculator target;

    public AtithmeticCalculatorLogginProxy(AtithmeticCalculator target) {
        this.target = target;
    }

    public AtithmeticCalculator getLogginProxy() {
        //代理对象由哪一个加载器负责加载
        ClassLoader loader = target.getClass().getClassLoader();
        //代理对象中有哪些方法
        Class[] interfaces = new Class[]{AtithmeticCalculator.class};

        //当代理对象中的方法执行时,执行代码
        InvocationHandler handler = new InvocationHandler() {
            /**
             *
             * @param proxy 正在返回的代理对象,在invoke中一般不使用该对象
             * @param method 调用的方法
             * @param args 调用的方法使用的呃参数
             * @return
             * @throws Throwable
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("The method " + method.getName() + " begins with " + Arrays.asList(args));
                //执行方法
                Object result = method.invoke(target, args);
                System.out.println("The method " + method.getName() + " ends with " + result);
                return result;
            }
        };
        AtithmeticCalculator proxy = (AtithmeticCalculator) Proxy.newProxyInstance(loader, interfaces, handler);
        return proxy;
    }
}

简单调用:

AtithmeticCalculator proxy = (new AtithmeticCalculatorLogginProxy(new AtithmeticCalculatorImpl())).getLogginProxy();

2.什么是AOP?

1.AOP面向切面编程,OOP是面向对象编程,AOP是对OOP的补充

2.AOP是切面模块化横切关注点

3.AOP编程时,仍需要定义公共功能,不不必修改受影响的类。

3.AOP术语

Lark20190715181232.png

1.切面:横切关注点被模块化的特殊对象

2.通知:切面必须要完成的工作(切面的每一个通知都称之为通知)

3.目标:被通知的对象

4.代理:向目标对象应用通知之后创建的对象

5.连接点:程序执行的某个特定位置:如类某个方法调用前、调用后、方法抛出异常后。

​ 连接点有两个信息确定:

​ a.方法表示的程序执行点

​ b.相对点标识的方位

​ 如:

​ 连接点为AtithmeticCalculator#add()方法执行前

​ 执行点为AtithmeticCalculator#add()

​ 方位为该方法执行前的位置。

6.切点:每个类都拥有多个连接点,AtithmeticCalculator的所有的方法实际上都是连接点,即连接点是客观存在的事物,有实体,AOP通过切点定位到特定的连接点。

​ eg:连接点相当于数据库中的记录,切点相当于查询条件

切点和连接点不是一对一的关系,一个切点匹配多个连接点,切点通过org.springframework.aop.Pointcut接口进行描述,它使用类和方法作为连接点的查询条件。

你可能感兴趣的:(AOP前奏)