Magician-Route 发布啦,去除反射,性能得到有效提升

2022-11-21 23:42:20 +08:00
 Joker123456789

Magician-Route 是 Magician 的官方 web 组件,由 Magician-Web 发展而来的新项目,主要是去掉了里面的反射,牺牲了一点易用性,将侧重点放在了性能上,两者的区别主要在于路由和拦截器的创建方式上。

Magician-Web 依然会继续维护,如果大家对反射的性能不是特别抗拒,而且更喜欢 Magician-Web 的风格,大可放心使用。

创建路由

由注解的形式改成了 传参的形式,每一次的请求都不再需要通过反射来执行了路由了,性能得到了有效提升

@Route
public class DemoRoute implements MagicianInitRoute {


    @Override
    public void initRoute(MagicianRouteCreate routeCreate) {

        routeCreate.get("/demo/getForm", request -> {

            return "{"msg":"hello login"}";

        });

        // Magician 的原生响应方式
        routeCreate.get("/demo/getForm2", request -> {

            request.getResponse().sendJson("{"msg":"hello login"}");
            return null;

        });

        routeCreate.post("/demo/json", request -> {

            DemoResponseVo demoResponseVo = new DemoResponseVo();
            demoResponseVo.setName("Beerus");

            return demoResponseVo;

        });
    }

}

将参数转化为实体对象

如果你想让实体类顺利的接收到参数,并且让参数验证生效,那么必须做如下步骤, 这种方式 底层是用的反射,如果你无法接受反射的性能,那么可以不用这种方式,选择权在你自己

routeCreate.get("/demo/getForm", request -> {

    DemoVO demoVO = ConversionUtil.conversion(request, DemoVO.class);

    return "{"msg":"hello login"}";
});

如果验证失败,conversionAndVerification 方法会抛出一个异常,这个异常会自动被响应给客户端,不需要开发者处理

routeCreate.get("/demo/getForm", request -> {

    DemoVO demoVO = ConversionUtil.conversionAndVerification(request, DemoVO.class);

    return "{"msg":"hello login"}";
});

如果你想获取到验证失败的提示信息 自己处理,可以用这种方式

routeCreate.get("/demo/getForm", request -> {

    try {
        DemoVO demoVO = ConversionUtil.conversionAndVerification(request, DemoVO.class);
    } catch(VerificationException e){
        // 这个就是 验证失败的提示信息
        String msg = e.getMessage();
    }
    
    return "{"msg":"hello login"}";
});

创建拦截器

跟路由一样,这种类也可以创建多个,根据你的需求 分开创建拦截器

@Interceptor
public class DemoInter implements MagicianInitInterceptor {

    @Override
    public void initInterceptor(MagicianInterceptorCreate interceptorCreate) {

        interceptorCreate.addInterceptor("/demo/*", new MagicianInterceptor() {
            @Override
            public Object before(MagicianRequest magicianRequest) {
                System.out.println("进入了拦截器");
                return SUCCESS;
            }

            @Override
            public Object after(MagicianRequest magicianRequest, Object o) {
                return SUCCESS;
            }
        });

        interceptorCreate.addInterceptor("/*/form", new MagicianInterceptor() {
            @Override
            public Object before(MagicianRequest magicianRequest) {
                System.out.println("进入了拦截器 2");
                return SUCCESS;
            }

            @Override
            public Object after(MagicianRequest magicianRequest, Object o) {
                return SUCCESS;
            }
        });
    }

}

可以访问官网了解更多:https://magician-io.com

1290 次点击
所在节点    Java
2 条回复
bthulu
2022-11-22 13:44:10 +08:00
看了代码才知道原来是 java 的, java 不是都 spring 一把梭么, 谁会来用你这个.
你整个 js 的说不定用的人还多些, 就前端最喜欢新玩意
Joker123456789
2022-11-22 15:00:12 +08:00
@bthulu

谢谢你的建议,

我只管好好开发,其他的交给天意。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/896937

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX