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

98 阅读3分钟

目录​​​​​​​

模拟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();
}

}