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

Springboot 那么大,不用什么场景都用它吧,要不尝试下 Mars- Java ?

  •  
  •   Joker123456789 · 2020-08-02 20:45:32 +08:00 · 12096 次点击
    这是一个创建于 1606 天前的主题,其中的信息可能已经有所发展或是发生改变。

    基本概念

    Mars-Java 是一个不需要容器的 Java 开发框架,不需要 Tomcat,不需要 JBoss,不需要 Netty,甚至连 Servlet 都不需要。

    一个纯基于 JRE 类库开发的 Http 服务,一个不需要容器的 Java 开发框架。

    他可以快速的开发出一个后端 Http 服务,支持 MVC,IOC,AOP,数据库操作,声明式事务等常用的特性,并且他更小,更快,更简单。

    为什么要用 Mars-Java

    当我们需要开发一些中小型网站的时候,如果使用 Java,那么往往会走向两个极端,要么使用非常简单的 JDBC+Servlet,要么使用非常巨大化的 Springboot+Mybatis,那么有没有一个折中的方案呢?当用户量可以预见的不会太多(多见于 B 端应用),又或者仅仅是一个逻辑不复杂的展示型网站,这个时候我们怎么办? 这个时候就可以使用 Mars-Java 了。

    它非常的小,不到 Springboot+Mybatis 的一半,它功能齐全,包含了 Springboot 常用的几大功能,并且有自己的持久层封装。同时它也有自己的生态,目前有一个小型的分布式组件 Mars-Cloud 。

    几乎可以解决你日常中的所有需求。

    MVC 支持的请求方式

    目前为止 MVC 支持 GET,POST 两种请求方式,这也是用的最多的两种方式,其他的暂时不支持。

    传参方式支持以下三种:

    • application/x-www-form-urlencoded
    • multipart/form-data
    • application/json

    数据库操作

    一、简单的单表操作

    // 根据主键查询一条数据
    @MarsGet(tableName = "userinfo",primaryKey = "id")
    public abstract `Return type` selectById(int id);
     
    // 插入一条数据
    @MarsUpdate(tableName = "userinfo",operType = OperType.INSERT)
    public abstract int insert(`Entity object parameter`);
     
    // 根据主键删除一条数
    @MarsUpdate(tableName = "userinfo",operType = OperType.DELETE,primaryKey = "id")
    public abstract int delete(int id);
     
    // 根据主键修改一条数据
    @MarsUpdate(tableName = "userinfo",operType = OperType.UPDATE,primaryKey = "id")
    public abstract int update(`Entity object parameter`);
    

    二、简单的分页操作

    // 如果你的 sql 语句是固定的,那么只需要这样就可以分页了
    @MarsSelect(sql = "select * from userinfo where name = #{name} and age = ${age}", resultType = 要返回的实体类.clss,page = true)
    public abstract PageModel<要返回的实体类> selectList(PageParamModel pageParamModel);
     
    // 如果你的 sql 语句不固定,那么就这样
    public PageModel<要返回的实体类> findPage(PageParamModel pageParamModel) throws Exception {
        String sql = "select * from userinfo where name like #{name}";
        return JdbcTemplate.get().selectPageList(sql,pageParamModel,DemoEntity.class);
    }
    

    声明式 API

    一、 先声明一下

    @MarsApi(refBean = "expApiService")
    public interface ExpApi {
     
        /**
         * get 请求示例
         * http://127.0.0.1:8080/expGetRequest?name=张三&names=王五&names=赵六
         * @param expVO
         * @return
         */
        List<ExpVO> expGetRequest(ExpVO expVO);
    }
    

    二、实现这个接口就好

    @MarsBean("expApiService")
    public class ExpApiService implements ExpApi {
     
     
        /**
         * 这个方法上加了 aop 监听
         * @param expVO
         * @return
         */
        @Override
        @MarsAop(className = ExpAop.class)
        public List<ExpVO> expGetRequest(ExpVO expVO) {
     
            // 打印接收到的参数,看是否接收成功
            System.out.println(expVO.getName());
            System.out.println(JSON.toJSONString(expVO.getNames()));
     
            // 返回数据
            return getExpResultData();
        }
    }
    

    对,你们没看错,Controller 层没了,为什么会这样呢?这得从 Controller 的作用说起,在实际开发中,Controller 基本上起到两个作用,一个是参数校验,一个是响应数据。

    在 Mars-Java 中,参数校验被封装掉了,直接用注解即可,响应数据,这个本来就没什么,直接返回就好,不需要去 Controller 里再返回一次了。

    所以,干脆去掉了,让使用者专注在业务逻辑上。

    官网地址:http://mars-framework.com

    116 条回复    2020-09-05 14:39:57 +08:00
    1  2  
    Joker123456789
        101
    Joker123456789  
    OP
       2020-08-04 20:49:37 +08:00
    @yvestang 两句都有缩进,这个输入框不支持,我也没办法,将就看吧。 我也不想在大庭广下和你争论,但是你评价是我的代码,这种公开抹黑质量的行为,我还是必须维护下的,所以不得不跟你争,望见谅。
    Joker123456789
        102
    Joker123456789  
    OP
       2020-08-04 20:56:32 +08:00   ❤️ 1
    @yvestang 再多说一句,你们认为的不足,在我眼里 却是故意不做的,所以我为什么要承认? 我解释一下我为什么不做,怎么就变成转移话题了? 大厂的人 都喜欢这样挑刺 来展现优越感吗?

    格式化的问题,是我不喜欢用工具自动缩进导致的,免不了有手误导致某些地方没空格。 但你一上来就来一句 [质量一般] ,而给出的理由也只有一个 那就是 [少了几个空格] ,我很无语.... 你如果拿点干货出来,说哪里的写法有问题,哪里有漏洞,哪里可以在优化下算法,我保证虚心接受。
    Joker123456789
        103
    Joker123456789  
    OP
       2020-08-04 20:59:32 +08:00
    @yvestang 我让你晒一下代码,你就急了,,这说明你也会有一些细致末梢的问题嘛,,, 自己怎么就不说呢? 就抓着我不放。

    最后在补充一句:你的话 是在否认我的质量,所以我不得不维护一下,我并不想跟你争论。
    zzl22100048
        104
    zzl22100048  
       2020-08-05 00:34:04 +08:00 via iPhone
    昨天试了下,用来做一些测试是非常方便的。可以考虑写给 maven 模板快速生成项目
    vcode
        105
    vcode  
       2020-08-05 14:50:47 +08:00
    不错
    fkdog
        106
    fkdog  
       2020-08-06 19:27:58 +08:00
    @Joker123456789 所以说你的开发面不广. 觉得自己的就是能满足整个世界的.
    这个世界除了你提供给别人的 API, 也有实现别人接口标准的 SPI, 最简单的例子就是回调接口.
    你自己的业务用 GET POST 没有一点问题, 但是别人的回调实现要求用 PUT DELETE 怎么办?

    另外浏览器最基础的一个 CORS, 用到的 OPTION 方法, 你连这个都无法提供实现, 浏览器怎么解决跨域问题.
    Joker123456789
        107
    Joker123456789  
    OP
       2020-08-06 21:44:30 +08:00
    @fkdog 我没打算满足全世界啊,不过话说回来,有哪个东西满足任意场景了吗? 还有,我说了很多次了,跨域是支持的,接口不受理 option,但是服务受理啊,你的 option 预判来了,服务会受理给你 200, 只不过不支持把接口设置成 option 。
    Joker123456789
        108
    Joker123456789  
    OP
       2020-08-06 22:11:03 +08:00
    @fkdog 我如果不支持跨域,怎么会丢弃转发和重定向,专门针对前后端分离的场景呢?

    而且支持 GET 和 POST 这件事,不管是这篇文章,还是我的文档上,都写得很清楚了,如果有人发现满足不了,那就说明这个项目不适合他嘛,选别的就好啦。

    最后呢,我还是要谢谢你 的宝贵建议,我后面会慢慢开放其他请求方式的受理。
    fkdog
        109
    fkdog  
       2020-08-13 13:16:07 +08:00
    @Joker123456789 做框架的像你这么想问题,那注定你做的永远只是个玩具.
    需求是动态未知的, 第一个版本可能你的功能足够满足需求, 但是第二个版本发现开始缺胳膊断腿, 那你这玩意让人进退两难怎么办?

    你可以不实现你认为没有必要的功能, 但是你有给你的框架留够足够多的扩展切入点么? 一个框架如果只考虑开发快不快, 那我也只能认为开发这个框架没乱用.

    你在上边 battle 了半天, 如果你真的技术基础够扎实, 你应该会想到用关键和常用的功能点里通过一定的设计模式来实现框架扩展的功能, 如果你的框架足够灵活和优秀, 那自然会有社区帮你来实现一些你没有时间完成的功能.

    然后你只是一句: 我觉得没有用 /没有必要.

    建议你再多码几年代码积累点经验. 像这样 CRUD 框架, github 上简直不要太多.
    Joker123456789
        110
    Joker123456789  
    OP
       2020-08-16 21:12:11 +08:00
    @fkdog
    你说的扩展是指什么?
    我内置 httpserver,但是你想用 tomcat 可以自己切换?
    我内置 durid,但是你想用 c3p0 可以自己切换?

    如果你指的是这种,那我可以很负责任地说,我从来没往这方面考虑,所以也就不会去做你嘴里的扩展性,我始终坚持一个场景只提供一种解决方案,就像 iphone 只提供 faceid,不提供屏下指纹一样。

    如果你不认同这个理念,那我只能说我们的想法不同吧,可能聊不到一块, 但我还是要说一个比较主观的观点,无论是 tomcat,还是 httpserver,甚至是 jboss,你总得选一个吧?总不能都要了不是? 无论是 durid 还是 c3p0 你也总得选一个吧? 那既然无论最后是什么组合,都是一个 内置服务,一个连接池,一个 xxx,对不对,你纠结这个,无非就是想说,我没用内置你喜欢的那个东西嘛,对不对?

    如果上面我所说的这个,不是你的意思,那我给你道歉,对不起,我误解了。

    接下来说一说其他的扩展:

    比如 支持 kafka,支持 activeMQ,支持 mongodb 等,这些完全没问题啊,这些项目本来就是可以单独使用的东西,又不是必须跟 spring 整合才能用,都可单独使用了,你还怕不能跟我的框架一起用吗? 无非现在就是缺少几个针对他们的 starter+工具类嘛,对不对? 但这是问题吗?

    所谓的 spring 生态,其实就是这些开源项目开发了针对 spring 的 starter 和工具类嘛, 他们又不是软件和系统的关系,一个软件在 windows 上能跑,在 mac 上不能跑,这个别人拿生态来说事,我还能理解,但是 kafka 和 spring 是这种关系吗?肯定不是啊。

    反正目前我个人对这个项目,最担心的地方就是其稳定性,毕竟还没正式在大型项目里用过。其他什么扩展性 都不是问题。
    Joker123456789
        111
    Joker123456789  
    OP
       2020-08-16 21:16:36 +08:00
    @fkdog 最后呢,我想真心地请教一个问题,是真心请教。你一直在说不够灵活,不够用,这个我承认我有点井底之蛙了,见识不够广。

    所以我真心的请教:可否举出一个实际的例子来? 什么样的需求,用这个框架实现不了,或者不好实现?
    joooooker21
        112
    joooooker21  
       2020-08-17 09:20:22 +08:00
    “只支持 GET,POST 两种请求方式”

    如果没有提供给用户扩展 DELETE 和 PUT 的切入点的话,框架设计是否符合软件设计的开闭原则?

    #109 已经很好的说明问题了
    Joker123456789
        113
    Joker123456789  
    OP
       2020-08-17 09:38:08 +08:00
    @joooooker21 最新版已经加入了 DELET 和 PUT 的支持
    fkdog
        114
    fkdog  
       2020-09-04 20:36:00 +08:00
    @Joker123456789 行吧, 鸡同鸭讲. 那就这样吧. v2 上的玩具框架我喷多了, 也不差你一个.
    Joker123456789
        115
    Joker123456789  
    OP
       2020-09-05 14:36:19 +08:00
    @fkdog 请问,你看到我的真心请教了吗? 如果看到了,那麻烦你赐教一下。不知道可否? 我这个人比较实际,你跟我说这个框架不灵活,那我比较希望听到,到底什么需求做不了,而不是简单的一句“不灵活”。

    如果你说不出来到底什么需求做不了,而气急败坏的用了一句“鸡同鸭讲”,“我喷多了”,“玩具框架”。 那恕我不能接受。

    还有哦, 你一开始的切入点就是 跨域问题,但是我很明确的解释过了,跨域是支持的,我的限制是做在了接口上而不是服务上,options 可以请求通过并返回 200 的。你看到后不肯承认错误,又开始喷别得了,我也是醉了。

    你但凡稍微写个 demo,也会知道支持跨域吧。连用都没用过,仅凭我这一篇文章上描述的信息,就开始喷了,简直就是盲人摸象。

    最后,麻烦你 举几个做不了的例子出来, [仅限业务需求 和 在 web 开发这个领域,不要说不支持 jsp 等模板,这属于技术需求而不是业务需求,用前后端分离可以完美解决] ,你只要举出来了,你可以把这些例子打印出来,打成厚厚的纸,狠狠的摔在我脸上,把我甩的鼻青脸肿,使劲的骂我辣鸡。我保证服服帖帖的。

    你说不够灵活,就要说出具体哪里不灵活,做什么需求做不了,不要简单的一句“不灵活”。
    Joker123456789
        116
    Joker123456789  
    OP
       2020-09-05 14:39:57 +08:00
    @fkdog 再接上一条回复: 我再啰嗦一遍,我内置 httpserver,你喜欢 tomcat,这不叫不灵活,这只是 我没提供你喜欢的那个东西。如果你说的不灵活是指这一类的,那你可以闭嘴了。 最后呢,我有解释的权利,但你没有喷人的权利,因为你不仅没使用这个框架,并且这个框架更没对你造成任何困扰和随时,你没资格喷。

    你一开始礼貌的发出的那些疑惑,我都是在耐心的解释给你听的,你最后来一句"鸡同鸭讲","你喷多了",“玩具框架”,我有点生气
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4910 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 01:11 · PVG 09:11 · LAX 17:11 · JFK 20:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.