模拟: springMVC 框架 设计执行链 interceptor handler执行顺序

目录​​​​​​​

模拟mvc框架 调用测试 

 拦截器接口

处理器接口 

自己定义执行链

定义 before方法-> handle()->after()  同时满足先进后出原则

 测试调用流程

测试结果: 

写在一起的代码整合(下面有代码哟...)


模拟mvc框架 调用测试 

/**
 * 模拟mvc框架测试
 *
 * 框架设计时会有一些对象的定义以及这些对象的执行流程 类似一个执行链
 *
 * 自定义拦截器方法执行顺序, 建议的 拦截器对象(很多个拦截器并发执行)
 */

 拦截器接口

/**
 * @Author pzy
 * @Version 0.1.0
 *
 * 拦截器接口 interceptor
 */

public interface HandlerInterceptor {
    //执行链开始
    default void before() {
    }

    //执行链结束   遵守先进后出原则
    default void after() {
    }
}

处理器接口 

/**
 * @Author pzy
 * @Version 0.1.0
 *
 * 处理器接口 controller
 */
public interface Handler {
    void processed();
}

自己定义执行链

定义 before方法-> handle()->after()  同时满足先进后出原则


/**
 * @Author pzy
 * @Version 0.1.0
 *
 * 定义一个执行链
 */

public class ExecutionChain {
    //一些拦截器
    private List<HandlerInterceptor> interceptors = new CopyOnWriteArrayList<>();
    //业务处理器
    private Handler handler;

    public ExecutionChain(List<HandlerInterceptor> interceptors, Handler handler) {
        this.handler = handler;
        this.interceptors.addAll(interceptors);
    }

    public void execute() {//负责执行业务的方法(例如处理请求)
        //1.先执行拦截器后执行控制器
        for (int i = 0; i < interceptors.size(); i++) {
            interceptors.get(i).before();
        }
        handler.processed();//aop中使用过
        //after方法
        for (int i = interceptors.size() - 1; i >= 0; i--) {
            interceptors.get(i).after();
        }
        //先进后出
    }
}

 测试调用流程

//TODO =================> 设计 框架执行逻辑 ====================>

public class SpringFrameworkOpen {
    public static void main(String[] args) {


        HandlerInterceptor handlerInterceptor01 = new HandlerInterceptor() {
            @Override
            public void after() {
                System.out.println("我是after1");
            }
            @Override
            public void before() {
                System.out.println("我是before1");
            }
        };
        HandlerInterceptor handlerInterceptor02 = new HandlerInterceptor() {
            @Override
            public void after() {
                System.out.println("我是after2");
            }
            @Override
            public void before() {
                System.out.println("我是before2");
            }
        };


        List<HandlerInterceptor> list = new CopyOnWriteArrayList<>();
        list.add(handlerInterceptor01);
        list.add(handlerInterceptor02);


        Handler handler = () -> System.out.println("我是handler");
//最重要的一步
        ExecutionChain chain = new ExecutionChain(list, handler);
        chain.execute();
    }

}

测试结果: 

我是before1
我是before2
我是handler
我是after2
我是after1

写在一起的代码整合(下面有代码哟...)

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;


//拦截器接口 interceptor
interface HandlerInterceptor {
    //执行链开始
    default void before() {

    }

    //执行链结束   遵守先进后出原则
    default void after() {
    }
}

//处理器接口 controller
interface Handler {
    void processed();
}

//定义一个执行链
class ExecutionChain {
    //一些拦截器
    private List<HandlerInterceptor> interceptors = new CopyOnWriteArrayList<>();
    //业务处理器
    private Handler handler;

    public ExecutionChain(List<HandlerInterceptor> interceptors, Handler handler) {
        this.handler = handler;
        this.interceptors.addAll(interceptors);
    }

//TODO =================> 设计 框架执行逻辑 ====================>
    public void execute() {//负责执行业务的方法(例如处理请求)
        //1.先执行拦截器后执行控制器
        for (int i = 0; i < interceptors.size(); i++) {
            interceptors.get(i).before();
        }
        handler.processed();//aop中使用过
        //after方法
        for (int i = interceptors.size() - 1; i >= 0; i--) {
            interceptors.get(i).after();
        }
        //先进后出
    }
}

public class SpringFrameworkAll{
    public static void main(String[] args) {


        HandlerInterceptor handlerInterceptor01 = new HandlerInterceptor() {
            @Override
            public void after() {
                System.out.println("我是after1");
            }
            @Override
            public void before() {
                System.out.println("我是before1");
            }
        };
        HandlerInterceptor handlerInterceptor02 = new HandlerInterceptor() {
            @Override
            public void after() {
                System.out.println("我是after2");
            }
            @Override
            public void before() {
                System.out.println("我是before2");
            }
        };


        List<HandlerInterceptor> list = new CopyOnWriteArrayList<>();
        list.add(handlerInterceptor01);
        list.add(handlerInterceptor02);


        Handler handler = () -> System.out.println("我是handler");

        ExecutionChain chain = new ExecutionChain(list, handler);
        chain.execute();
    }

}
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pingzhuyan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值