美文网首页
SpringAOP-多个AOP如何叠加

SpringAOP-多个AOP如何叠加

作者: 8813d76fee36 | 来源:发表于2018-01-30 11:31 被阅读46次

慕课网《 探秘Spring AOP》笔记

笔记代码
https://gitee.com/oooh2016/SpringAOP-Demo

当多个AOP作用在同一个对象是如何叠加的

采用责任链模式


责任链模式

Client调用Handler,Handler中有一个抽象的HandleProcess()方法,需要由实现类实现,实现类又组合了Handler,通过successor判断实现链式调用。

简单示例

工程结构

工程结构

Handler

package dev.wj.springaopdemo.chain;

/**
 * @Author: WJ
 * @Description:
 * @Date: Created in 上午10:03 2018/1/30
 */
public abstract class Handler {

    /**
     * 用于判断接下来是否还有处理
     */
    private Handler successor;

    /**
     * 由子类去实现
     */
    protected abstract void handleProcess();

    /**
     * 该方法对外暴露,实现链式调用
     */
    public void execute() {
        handleProcess(); //首先处理自己的handleProcess
        if (successor != null) {
            successor.execute(); //判断successor不为空则继续调用successor的execute()方法
        }
    }

    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }
}

客户端

package dev.wj.springaopdemo.chain;

/**
 * @Author: WJ
 * @Description:
 * @Date: Created in 上午10:07 2018/1/30
 */
public class Client {

    /**构造几个Handler的实现*/
    static class HandlerA extends Handler {
        @Override
        protected void handleProcess() {
            System.out.println("Handle by A");
        }
    }

    static class HandlerB extends  Handler {
        @Override
        protected void handleProcess() {
            System.out.println("Handle by B");
        }
    }

    static class HandlerC extends  Handler {
        @Override
        protected void handleProcess() {
            System.out.println("Handle by C");
        }
    }

    public static void main(String[] args) {

        //示例话Handler实现类
        Handler handlerA = new HandlerA();
        Handler handlerB = new HandlerB();
        Handler handlerC = new HandlerC();

        //设置调用关系
        handlerA.setSuccessor(handlerB);
        handlerB.setSuccessor(handlerC);

        //从第一个开始执行
        handlerA.execute();
    }

}

执行结果

执行结果

在这个例子中,每次都要手动设置调用关系。针对这点进行改进。

改进示例--仿Spring实现

将上个例子中的调用关系设置代码封装。

项目结构

项目结构

Chain 封装调用链

package dev.wj.springaopdemo.chain;

import java.util.List;

/**
 * @Author: WJ
 * @Description: 封装调用链
 * @Date: Created in 上午11:16 2018/1/30
 */
public class Chain {

    /**封装顺序关系*/
    private List<ChainHandler> handlers;

    /**标记顺序序号*/
    private int index = 0;

    public Chain(List<ChainHandler> handlers) {
        this.handlers = handlers;
    }

    /**暴露给客户端调用*/
    public void proceed() {

        /**
         * 维护index,遍历handler
         * 调用execute()方法实现递归
         */
        if (index >= handlers.size()) {
            return ;
        }
        handlers.get(index++).execute(this);
    }
}

ChainHandler


package dev.wj.springaopdemo.chain;

/**
 * @Author: WJ
 * @Description:
 * @Date: Created in 上午11:15 2018/1/30
 */
public abstract class ChainHandler {

    /**
     * 递归地执行调用链
     * @param chain
     */
    public void execute(Chain chain) {
        handleProcess();
        chain.proceed();
    }

    /**
     * 由子类去实现
     */
    protected abstract void handleProcess();
}

客户端

package dev.wj.springaopdemo.chain;

import java.util.Arrays;
import java.util.List;

/**
 * @Author: WJ
 * @Description: 客户端
 * @Date: Created in 上午11:21 2018/1/30
 */
public class ChainClient {

    /**构造几个Handler的实现*/
    static class ChainHandlerA extends ChainHandler {
        @Override
        protected void handleProcess() {
            System.out.println("Handled By A");
        }
    }

    static class ChainHandlerB extends ChainHandler {
        @Override
        protected void handleProcess() {
            System.out.println("Handled By B");
        }
    }

    static class ChainHandlerC extends ChainHandler {
        @Override
        protected void handleProcess() {
            System.out.println("Handled By C");
        }
    }

    public static void main(String[] args) {
        List<ChainHandler> handlers = Arrays.asList(
                new ChainHandlerA(),
                new ChainHandlerB(),
                new ChainHandlerC()
        );
        Chain chain = new Chain(handlers);
        chain.proceed();
    }
}

执行结果

执行结果

Spring责任链实现

Spring责任链实现

相关文章

  • SpringAOP-多个AOP如何叠加

    慕课网《 探秘Spring AOP》笔记 笔记代码https://gitee.com/oooh2016/Sprin...

  • 2019/1/6 --第21天

    9:00--10:36 Aop责任链,解决多个aop叠加问题类于类之间,通过游标的变化,来实现方法循环 (瞎写的,...

  • lambdaMART-1.GBDT

    boosting思想:叠加多个弱模型,渐进的逼近真实情况。问题在于:如何保证拟合方向正确,如何叠加弱模型的结果。 ...

  • iOS 多个window叠加

    window,多个时,[UIApplication sharedApplication].windows[0]和[...

  • Spring 讲解(六)

    如何理解 Spring 中的 AOP 一、AOP 的概述 AOP(Aspect Oriented Programm...

  • pytest的fixture传参数

    fixture传多个参数 多个fixtur只加一个装饰器 多个fixtur叠加装饰器

  • Android笔记——用layer-list和shape画加号

    首先layer-list可实现多个drawable叠加效果,每个drawable都写在item中以实现叠加,ite...

  • Spring_AOP_01——概念讲解

    该文主要讲Spring AOP的一些概念,不会细讲如何使用AOP。关于AOP的使用,可以参考文末链接。 AOP 概...

  • 轻松学会产品设计(第十二篇-造型方法5)

    发布“叠加”那篇以后,很多朋友都在问,知道叠加方式,但是叠加起来感觉不舒服。 现在讲讲叠加融合形式和rhino如何...

  • 13. Python之装饰器

    1 什么是装饰器 2 为何要用装饰器 3 如何使用装饰器 4 语法糖 5 叠加多个装饰器,加载顺序与运行顺序 6 ...

网友评论

      本文标题:SpringAOP-多个AOP如何叠加

      本文链接:https://www.haomeiwen.com/subject/ztmqzxtx.html