Web 请求处理过程示意图(AOP)

关键接口预览
1、Filter, 过滤器(环绕式)
@FunctionalInterface
public interface Filter {
    /**
     * 过滤
     * */
    void doFilter(Context ctx, FilterChain chain) throws Throwable;
}
2、RouterInterceptor, 路由拦截器(环绕式)
public interface RouterInterceptor {
    /**
     * 路径匹配模式(控制拦截的路径区配)
     * */
    default PathRule pathPatterns(){
        //null 表示全部
        return null;
    }
    
    /**
     * 拦截
     */
    void doIntercept(Context ctx,
                     @Nullable Handler mainHandler,
                     RouterInterceptorChain chain) throws Throwable;
    /**
     * 提交结果(action / render 执行前调用)
     */
    default Object postResult(Context ctx, @Nullable Object result) throws Throwable {
        return result;
    }
}
在路由拦截阶段,已经从路由器里找出 Main Handler(并作为拦截时的参数):
- 可能是 null
 - 可能是 Handler 或它的扩展类(Actoin、Gateway 等)
 
同时也产生默认状态码:
- 可能是 404
 - 可能是 405(有路由记录,但是 http mehtod 不匹配)
 
3、EntityConverter(实体转换器)、MethodArgumentResolver(方法参数分析器)
EntityConverter 的作用有两个(一般使用 Solon Serialization 插件即可):
- 把 
Request Body(form、json 等) 转换成@Mapping方法的参数。 - 把 
@Mapping方法的返回结果(或ctx.returnValue()),输出到Reponse Body。(会自动转换为 Render) 
public interface EntityConverter {
    //实例检测(移除时用)
    default boolean isInstance(Class<?> clz) {
        return clz.isInstance(this);
    }
    //名字
    default String name() {
        return this.getClass().getSimpleName();
    }
    //关系映射
    default String[] mappings() {
        return null;
    }
    //是否允许写
    boolean allowWrite();
    //是否能写
    boolean canWrite(String mime, Context ctx);
    //写入并返回(渲染并返回(默认不实现))
    String writeAndReturn(Object data, Context ctx) throws Throwable;
    //写入
    void write(Object data, Context ctx) throws Throwable;
    //是否允许读
    boolean allowRead();
    //是否能读
    boolean canRead(Context ctx, String mime);
    //读取(参数分析)
    Object[] read(Context ctx, Object target, MethodWrap mWrap) throws Throwable;
}
MethodArgumentResolver 的作用,是为@Mapping 方法的某一个参数提供分析支持。
public interface MethodArgumentResolver {
    //是否匹配
    boolean matched(Context ctx, ParamWrap pWrap);
    //参数分析
    Object resolveArgument(Context ctx, Object target, MethodWrap mWrap, ParamWrap pWrap, int pIndex, LazyReference bodyRef) throws Throwable;
}
4、MethodInterceptor, 拦截器(环绕式)
被代理的托管对象,在执行方法时,会先执行 MethodInterceptor。
@FunctionalInterface
public interface MethodInterceptor {
    /**
     * 拦截
     * */
    Object doIntercept(Invocation inv) throws Throwable;
}
//绑定 MethodInterceptor 接口实现
@Around(MethodInterceptor.class)
5、ReturnValueHandler,返回值处理
比如返回 Flux<String>(响应式流)、SseEmitter(SSE发射器),是在扩展插件实现的。通过注册 ReturnValueHandler 实现扩展处理。
public interface ReturnValueHandler {
    //是否匹配
    boolean matched(Context ctx, Class<?> returnType);
    //返回处理
    void returnHandle(Context ctx, Object returnValue) throws Throwable;
}
6、Render 渲染器
负责渲染输出。比如模板渲染并输出,序列化渲染并输出。
@FunctionalInterface
public interface Render {
    //名字
    default String name() {
        return this.getClass().getSimpleName();
    }
    //映射
    default String[] mappings() {
        return null;
    }
    //是否匹配
    default boolean matched(Context ctx, String mime) {
        return false;
    }
    //渲染并返回(默认不实现)
    default String renderAndReturn(Object data, Context ctx) throws Throwable {
        return null;
    }
    //渲染
    void render(Object data, Context ctx) throws Throwable;
}