美文网首页
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如何叠加

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