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

2020-08-02 20:45:32 +08:00
 Joker123456789

基本概念

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 两种请求方式,这也是用的最多的两种方式,其他的暂时不支持。

传参方式支持以下三种:

数据库操作

一、简单的单表操作

// 根据主键查询一条数据
@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

12041 次点击
所在节点    Java
116 条回复
alienx717
2020-08-03 16:01:10 +08:00
可以可以,以前有些场景,比如一个独立的获取数据的服务,我用 python 写了,就是 post 方式获取数据,然后入库,再怎么导出这种,如果非要用 Java 些,我可以试试用这个框架
tairan2006
2020-08-03 17:44:47 +08:00
没啥意义,搞精简不如直接用 go 了…用 Java 就是要框架啊,企业级开发就是看生态
qwerthhusn
2020-08-03 17:55:31 +08:00
一个不需要容器的 Java 开发框架,不需要 Tomcat,不需要 JBoss,不需要 Netty,甚至连 Servlet 都不需要。

那底层的 HTTP 协议解析是用的啥? com.sun.net.httpserver.HttpServer ?还是其他的 HTTP 解析库?不会是自己写的吧?
wysnylc
2020-08-03 18:07:45 +08:00
@qwerthhusn #62 自己写的不敢用,内置其他容器又打脸自己
wysnylc
2020-08-03 18:23:57 +08:00

挺矫情的
nl101531
2020-08-03 19:50:34 +08:00
v2ex 社区越来越不友善了,题主要忍受下哈,加油,支持
fkdog
2020-08-03 20:21:46 +08:00
无新意, 同类框架太多. 功能缺失太多,连最基本的 PUT/DELETE/OPTION 都没有实现, 个人觉得 lz 可能开发面稍微窄了点, 便觉得这些东西无所谓.

我看框架介绍很少看使用介绍, 我反而更看重框架里并发 /锁一类的实际运用, 如果代码篇幅太长也可以附一个压测的性能报告?然后与其他同类框架做比较?

你这个介绍里什么也没, 然后就说更快, 那么更快在哪里?

或许 lz 可以往码农们痛点方向造点轮子? 比如无缝热加载免重启一类的, 再或者是阿里巴巴 arthas 这种线上运行时检查环境的工具?
Joker123456789
2020-08-03 20:51:33 +08:00
@fkdog PUT,DELETE,OPTION 不能用 POST 替代吗?能吧? 我还没见过 POST 搞不定的地方,如果你要实现 restful 风格,用请求方式来区分 本次请求的意图, 那我不太喜欢这种方式,所以也不会往那方面考虑,我始终是喜欢 一个意图一个接口,而不是弄好多名称一样的接口,靠请求方式来区分。

测试报告之类的,正在考虑怎么弄,现在人手不够。

最后的那个建议,我听进去了,做不做那就看缘分吧。
Joker123456789
2020-08-03 20:53:16 +08:00
@nl101531 谢谢你的关心,不过我看开了,因为本来就不介意。 世界上还没有谁是人人都喜欢的,即使是杰克逊,乔布斯,李小龙,牛顿等人 都有人骂。很正常的。
Joker123456789
2020-08-03 20:55:22 +08:00
@qwerthhusn 对,就是用的这个 com.sun.net.httpserver.HttpServer
KentY
2020-08-03 21:09:07 +08:00
我觉得对现有东西有不满, 想自己创新这个精神还是应该鼓励的, 否则就不会有 Spring1.0 替代 Ejb2, 不会有 LInux 的出现, 不会有... 很多新东西.

看着咱们这的评论感觉有点不太友善. 可以批评但是应该完全了解了人家的东西, 个人的不一定就是差的. 前面的例子, spring and linux 开始都是个人项目.

可能 LZ 的"宣传"方式也有可斟酌的地方. 你说"更小, 更快, 更简单"这其实作为技术的描述, 让人很难理解. 你做了一个 spring 也可以干的事, 一定是对 spring 有不满的地方, 你的不满具体是什么? 什么样的应用选择你这个会比 spring 有优势?

你说的比 spring"更快", 什么调用更快? 什么具体测试环境? 快多少? benchmark 呢?

"更小", 我猜你说的是包的 size, 那牺牲的扩展性有多少, 现在的应用不光是查个数据库然后分页显示, 再 CRUD 就完了的. 比如也是小型企业应用常用的 message queue, cache, security 等等这些, spring 都有比较完善的简化实现 /配置方案, 这些如果在你这个 framework 基础上扩展起来的易用性如何? 当然这也引入了"更简单"的讨论.

可能立足这些实质性的区别与针对性的应用场景来"宣传", 或者"征求意见" 大家会有不同的态度.
zzl22100048
2020-08-03 21:25:29 +08:00
zzl22100048
2020-08-03 21:26:33 +08:00
GuoGuang
2020-08-03 22:08:07 +08:00
你拿这个框架对比 springboot,称更小,更快,更简单,可是没有数据证明,只是靠你的一句话,实在让人无法信服,并且我也没看到除了你说的小快简单之外解决 SpringBoot 的什么痛点,目前这个只能定位于 CRUD 框架
Zien
2020-08-04 00:55:39 +08:00
感觉不错的样子,简化很多,适合个人项目
retanoj
2020-08-04 08:55:06 +08:00
看到 lz 对 options 请求的回帖,我心态崩了。。
IfEles
2020-08-04 08:59:13 +08:00
先 star 支持一下
wind98
2020-08-04 09:26:57 +08:00
@retanoj +1 options web 跨域必备啊
Joker123456789
2020-08-04 09:47:40 +08:00
@retanoj 怪我表达不清晰,我的意思是接口无法设置成 options,但是跨域时发出的那个 options 预判,是可以受理的。 我这里不支持的意思是 接口不受理,并不是请求不通。 也就是说服务是接受 options 的,只是接口不受理。 并不影响跨域。
Yuicon
2020-08-04 10:06:38 +08:00
感觉没啥区别 功能还少了 我特意多学一遍你这个是干什么 更别说开发者不尊重协议 搞非主流

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

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

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

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

© 2021 V2EX