V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Joker123456789
V2EX  ›  Java

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

  •  
  •   Joker123456789 · 2022-11-21 23:42:20 +08:00 · 1477 次点击
    这是一个创建于 738 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    创建路由

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

    • 这样的类可以创建多个,根据你的需求 将路由分开创建
    • 每个路由内部,如果没有特别的需要 就不需要加 try-catch ,框架内部做了处理,一旦发生异常,会将异常信息以 json 的形式响应给客户端
    • 直接返回需要响应的对象,框架会自动转成 json 并返回给客户端,你也可以采用如下示例中 “Magician 的原生响应方式” 将数据返回给客户端,具体可以看 Magician 文档的《响应参数》
    @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"}";
    });
    

    创建拦截器

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

    • 第一个参数为拦截规则,全部拦截 配置 * 即可,否则的话,必须以 / 开头
    • 如果拦截器顺利放行的话,返回 SUCCESS 就好了,如果不给通过,那么直接返回 错误提示信息(返回对象会自定转成 json )
    @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

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

    谢谢你的建议,

    我只管好好开发,其他的交给天意。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1802 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 16:34 · PVG 00:34 · LAX 08:34 · JFK 11:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.