Mars-Java 是一个不需要容器的 Java 开发框架,不需要 Tomcat,不需要 JBoss,不需要 Netty,甚至连 Servlet 都不需要。
一个纯基于 JRE 类库开发的 Http 服务,一个不需要容器的 Java 开发框架。
他可以快速的开发出一个后端 Http 服务,支持 MVC,IOC,AOP,数据库操作,声明式事务等常用的特性,并且他更小,更快,更简单。
当我们需要开发一些中小型网站的时候,如果使用 Java,那么往往会走向两个极端,要么使用非常简单的 JDBC+Servlet,要么使用非常巨大化的 Springboot+Mybatis,那么有没有一个折中的方案呢?当用户量可以预见的不会太多(多见于 B 端应用),又或者仅仅是一个逻辑不复杂的展示型网站,这个时候我们怎么办? 这个时候就可以使用 Mars-Java 了。
它非常的小,不到 Springboot+Mybatis 的一半,它功能齐全,包含了 Springboot 常用的几大功能,并且有自己的持久层封装。同时它也有自己的生态,目前有一个小型的分布式组件 Mars-Cloud 。
几乎可以解决你日常中的所有需求。
目前为止 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);
}
@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 里再返回一次了。
所以,干脆去掉了,让使用者专注在业务逻辑上。
1
johnsona 2020-08-02 21:57:26 +08:00
不用
|
2
zhuangzhuang1988 2020-08-02 22:16:03 +08:00
大不是问题 主要是生态
|
3
zclHIT 2020-08-02 22:24:55 +08:00
star 一波,感觉自己的项目上撸着玩不错,拿去写服务扔到生产环境我还是有点虚。。。
|
4
Salvation 2020-08-02 22:27:33 +08:00 1
1. “非常巨大化的 Springboot+Mybatis” 有点夸张吧,所谓巨大在于?
2. “几乎可以解决你日常中的所有需求”,不太现实。为啥 java 、spring 、springboot 这些天天被唱衰,还活得这么好呢?核心原因不是他有哪些问题,而是他的生态。生态意味着:当遇到问题,在当前框架下存在成本可控的解决方案。而这个框架我看着是做了阉割,个人很怀疑出了问题能否 cover 。 3. 官网打不开。 |
5
rockyou12 2020-08-02 22:30:33 +08:00
额,lz 造轮子建议先写个简单表格对比下主流框架,spring mcv 、spring data jpa 、mybatis 、vertx 这些……
|
6
Joker123456789 OP @Salvation
非常感谢你的评论,我简单回复一下吧。 1. 第一点见仁见智,这个不做讨论。 2. 第二点,我说的日常中的需求,前提是日常,当然了每个人对日常的理解和定义可能也不同,所以也不做争论。 生态问题,是全球一起努力的结果,当然了我这个项目目前没 spring 那种号召力,属于一个稚嫩的婴儿吧,但是也因为如此,开源的意义不就体现出来了吗? 开源和免费是不能划等号的哦,如果只是为了免费给大家用 那何必要开源呢,360 永久免费,QQ,微信免费,但是他没开源啊,我们不也一样用的好好的。 开源的意义在于大家一起完善,一起来做这个事,喜欢的人可以偶尔提提 PR,甚至可以一起完善。 3. 官网是打的开的,可能是万网没解析到你使用的 DNS 上吧。 |
7
sagaxu 2020-08-02 22:41:38 +08:00 via Android
只支持 GET 和 POST ? CORS 的 OPTIONS 请求也不支持?
|
8
Joker123456789 OP @sagaxu 是的,因为 POST 已经够用了,我们常用的几种传参方式:
1. application/x-www-form-urlencoded [常规表单] 2. multipart/form-data [文件上传] 3. application/json [json 提交] 这些都支持,所以暂时不打算做更多的东西进来,我的理念是往精简了做,精简到不能再精简。 |
9
watzds 2020-08-02 22:46:20 +08:00 via Android
可以用来玩玩,或者几个人的小公司
|
10
chendy 2020-08-02 23:05:56 +08:00 2
Springboot 那么大,不用什么场景都用它吧
Springboot 那么大,就是要所有场景都用它 |
11
mimimiZ 2020-08-02 23:14:39 +08:00 via iPhone 1
看到官网写 more than 100 companies are using this framework. 然后下面 they are using 的 logo 都是 placeholder ?
|
12
sagaxu 2020-08-02 23:16:34 +08:00 via Android
@Joker123456789 精简的有些严苛了,比如 application/x-protobuf 也很常见,一些边角场景平时可能用不大上,但是需要用的时候没有就尴尬了
|
13
aguesuka 2020-08-02 23:26:54 +08:00 via Android
你已经连续发了两个帖子了,而且愈发有标题党的意思,
|
14
zzl22100048 2020-08-03 00:06:24 +08:00 via iPhone
@Joker123456789 没 OPTION 跨域也放弃了?
|
15
monkeyk 2020-08-03 00:21:53 +08:00
实践是检验真理的唯一 标准
|
16
xmge 2020-08-03 00:28:31 +08:00
java 那么大,用 go 吧
|
17
chihiro2014 2020-08-03 01:37:03 +08:00
没有太大意义。如果讨厌 Spring Boot,那可以去使用 Quarkus
|
18
yiyi11 2020-08-03 07:31:10 +08:00 via Android 2
springboot 就是要通吃,手中有锤,看谁皆钉。
|
19
sue0917 2020-08-03 08:20:01 +08:00 via iPhone
看注解名字,低了啊
|
20
zjsxwc 2020-08-03 08:20:15 +08:00
这个框架看来只能用来写 json 的 api 接口,浏览器网页相关的还是算了
|
21
xuanbg 2020-08-03 08:29:59 +08:00 1
Spring boot 太大???你们说大就大吧,反正我也没啥感觉,你们说的都对。打个包几 M 还是几十 M 对我而言根本不是问题,我的核心诉求是用起来要方便。
|
22
Rwing 2020-08-03 08:31:32 +08:00 1
要不尝试下 C# ?
|
23
122006 2020-08-03 08:40:40 +08:00
andserver 真香(本地服务器
|
24
HiShan 2020-08-03 08:46:13 +08:00
看官网,真的有超过 100 家企业在用了吗?
|
25
witcherhope 2020-08-03 08:46:56 +08:00 via iPhone
不用 Springboot 可以用 Quarkus,支持 AOT 特性,启动速度和内存占用都不错
|
26
HenryWang0723 2020-08-03 08:54:14 +08:00 1
虽然不用,表示支持
|
27
siweipancc 2020-08-03 08:58:36 +08:00 via iPhone
不用
|
28
renmu123 2020-08-03 09:05:09 +08:00 via Android 1
连 http 的几个方法都不完整支持,不敢用
|
29
sunziren 2020-08-03 09:09:07 +08:00
有意思,我试试。
|
30
arthas2234 2020-08-03 09:16:15 +08:00
这种要替代 spring boot 的框架,还是个人项目,万一不维护了,那不是要哭了
|
31
TheBestSivir 2020-08-03 09:18:29 +08:00
10 年前甚至得更久以前,这种应用框架谈一谈轻量还有点意义。
当下的轻量就是简陋 |
32
Joker123456789 OP @aguesuka 这个项目做很久了,只是近期才来这里发帖子,就把以前发的文章拷贝了两篇过来。 哈哈
|
33
BarZu 2020-08-03 09:25:18 +08:00
给个留言,以资鼓励
|
34
Joker123456789 OP @zzl22100048 有跨域啊,怎么会没跨域。
|
35
jimideer 2020-08-03 09:37:54 +08:00
所有造轮子的人都支持!
|
36
Joker123456789 OP @chihiro2014 我相信 Quarkus 刚做的时候,也有人对他说过这句话。
|
37
Joker123456789 OP @zjsxwc 是的,就是纯面向 前后端分离的场景。 这年头 如果有公司把页面写在 java 项目里,我相信也没几个人愿意在那干下去吧。 所以,干脆精简掉了
|
38
Joker123456789 OP @TheBestSivir 轻量和简陋本身就是看怎么理解。 有人觉得微信是神,有人觉得微信就是阉割版的 QQ 。有人觉得 IOS 是神,也有人觉得 IOS 功能少。 所以见仁见智吧。
|
39
gotonull 2020-08-03 09:43:22 +08:00
我选择 vertx
|
40
tctc4869 2020-08-03 10:05:44 +08:00
这个跟 Spring MVC 有何区别?还是用 Controller 和 Action+注解配置的这种形式么?
|
41
337136897 2020-08-03 10:12:05 +08:00
看标题先不看内容,你居然讲 spring boot 大? TM 的你去用别的语言试试,python 的一两百兆,note 的几百起步 2G 封顶
|
42
Marsss 2020-08-03 10:13:46 +08:00
不如用 go 咯
|
43
RJH 2020-08-03 10:24:37 +08:00
spring boot 的优势是生态完整,基本上遇到的问题 90%都可以用它生态内的东西解决掉,而且踩坑的人多,搜索就可以找到对应问题的解决办法。
|
44
zhout 2020-08-03 10:39:20 +08:00
和 jFinal 相比,有哪些优点和缺点?
|
45
MakHoCheung 2020-08-03 10:41:28 +08:00 via iPhone
除了 spring 还要 quarkus 、micronaut 、vertx 和 ktor
|
46
niceshell 2020-08-03 11:05:00 +08:00
那为什么要用 java 不用 go 、.net
|
47
ldlood 2020-08-03 11:05:17 +08:00
所有敢于造轮子的,都值得支持,加油
|
48
rykinia 2020-08-03 11:25:02 +08:00
也许是更小,但是更快有证据吗,还是说仅指启动速度?
|
49
zzl22100048 2020-08-03 13:00:41 +08:00 via iPhone
@Joker123456789 POST 发送 json 是非简单请求会发送 OPTION 校验呢,前面不是说不支持 OPTION ?
|
50
Joker123456789 OP @zzl22100048 post 发送 json 是用的 application/json,反正我没遇到过用 option 的, 也可能是我们两个说的不是一个东西。
|
51
fovecifer 2020-08-03 13:33:02 +08:00
请教一个问题啊,文中的“容器”具体对应的是哪个英文词汇呢?
|
52
Joker123456789 OP @fovecifer 这个就超出我的认知范围了,我英语不好。 我只能举例子来说明这里的容器是啥, 这里的容器指的是:tomcat,jboss,jetty 等东。
|
53
Cbdy 2020-08-03 13:35:40 +08:00
简单的 Spring Boot ( Web + JDBC )的 hello world demo
implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-jdbc' 引入 65 个 jar,打包出来的 fat jar 为 17MB 其实还好,没有那么巨大 |
54
pushback 2020-08-03 13:44:27 +08:00
可以扩展 TCP 吗
|
56
zzl22100048 2020-08-03 13:54:39 +08:00 via iPhone
@Joker123456789 使用浏览器网页访问接口才会出现 preflight
|
57
Joker123456789 OP @zzl22100048 你说的是跨域吧? 跨域设置响应头就好了, 这个是支持的。
|
58
gaigechunfeng 2020-08-03 14:01:35 +08:00
这个必须得来支持一波了。
|
59
40EaE5uJO3Xt1VVa 2020-08-03 14:03:50 +08:00
osc 上关注很久了。只是关注还没用。
v2ex 不是个友好的社区。建议做好足够的心理准备接受无聊的嘲讽 |
60
iamstrong 2020-08-03 14:19:25 +08:00
支持一波,个人项目可以尝试下
|
61
alienx717 2020-08-03 16:01:10 +08:00
可以可以,以前有些场景,比如一个独立的获取数据的服务,我用 python 写了,就是 post 方式获取数据,然后入库,再怎么导出这种,如果非要用 Java 些,我可以试试用这个框架
|
62
tairan2006 2020-08-03 17:44:47 +08:00
没啥意义,搞精简不如直接用 go 了…用 Java 就是要框架啊,企业级开发就是看生态
|
63
qwerthhusn 2020-08-03 17:55:31 +08:00
一个不需要容器的 Java 开发框架,不需要 Tomcat,不需要 JBoss,不需要 Netty,甚至连 Servlet 都不需要。
那底层的 HTTP 协议解析是用的啥? com.sun.net.httpserver.HttpServer ?还是其他的 HTTP 解析库?不会是自己写的吧? |
64
wysnylc 2020-08-03 18:07:45 +08:00
@qwerthhusn #62 自己写的不敢用,内置其他容器又打脸自己
|
65
wysnylc 2020-08-03 18:23:57 +08:00
|
66
nl101531 2020-08-03 19:50:34 +08:00 via iPhone
v2ex 社区越来越不友善了,题主要忍受下哈,加油,支持
|
67
fkdog 2020-08-03 20:21:46 +08:00
无新意, 同类框架太多. 功能缺失太多,连最基本的 PUT/DELETE/OPTION 都没有实现, 个人觉得 lz 可能开发面稍微窄了点, 便觉得这些东西无所谓.
我看框架介绍很少看使用介绍, 我反而更看重框架里并发 /锁一类的实际运用, 如果代码篇幅太长也可以附一个压测的性能报告?然后与其他同类框架做比较? 你这个介绍里什么也没, 然后就说更快, 那么更快在哪里? 或许 lz 可以往码农们痛点方向造点轮子? 比如无缝热加载免重启一类的, 再或者是阿里巴巴 arthas 这种线上运行时检查环境的工具? |
68
Joker123456789 OP @fkdog PUT,DELETE,OPTION 不能用 POST 替代吗?能吧? 我还没见过 POST 搞不定的地方,如果你要实现 restful 风格,用请求方式来区分 本次请求的意图, 那我不太喜欢这种方式,所以也不会往那方面考虑,我始终是喜欢 一个意图一个接口,而不是弄好多名称一样的接口,靠请求方式来区分。
测试报告之类的,正在考虑怎么弄,现在人手不够。 最后的那个建议,我听进去了,做不做那就看缘分吧。 |
69
Joker123456789 OP @nl101531 谢谢你的关心,不过我看开了,因为本来就不介意。 世界上还没有谁是人人都喜欢的,即使是杰克逊,乔布斯,李小龙,牛顿等人 都有人骂。很正常的。
|
70
Joker123456789 OP @qwerthhusn 对,就是用的这个 com.sun.net.httpserver.HttpServer
|
71
KentY 2020-08-03 21:09:07 +08:00 6
我觉得对现有东西有不满, 想自己创新这个精神还是应该鼓励的, 否则就不会有 Spring1.0 替代 Ejb2, 不会有 LInux 的出现, 不会有... 很多新东西.
看着咱们这的评论感觉有点不太友善. 可以批评但是应该完全了解了人家的东西, 个人的不一定就是差的. 前面的例子, spring and linux 开始都是个人项目. 可能 LZ 的"宣传"方式也有可斟酌的地方. 你说"更小, 更快, 更简单"这其实作为技术的描述, 让人很难理解. 你做了一个 spring 也可以干的事, 一定是对 spring 有不满的地方, 你的不满具体是什么? 什么样的应用选择你这个会比 spring 有优势? 你说的比 spring"更快", 什么调用更快? 什么具体测试环境? 快多少? benchmark 呢? "更小", 我猜你说的是包的 size, 那牺牲的扩展性有多少, 现在的应用不光是查个数据库然后分页显示, 再 CRUD 就完了的. 比如也是小型企业应用常用的 message queue, cache, security 等等这些, spring 都有比较完善的简化实现 /配置方案, 这些如果在你这个 framework 基础上扩展起来的易用性如何? 当然这也引入了"更简单"的讨论. 可能立足这些实质性的区别与针对性的应用场景来"宣传", 或者"征求意见" 大家会有不同的态度. |
72
zzl22100048 2020-08-03 21:25:29 +08:00 via iPhone
|
73
zzl22100048 2020-08-03 21:26:33 +08:00 via iPhone
|
74
GuoGuang 2020-08-03 22:08:07 +08:00
你拿这个框架对比 springboot,称更小,更快,更简单,可是没有数据证明,只是靠你的一句话,实在让人无法信服,并且我也没看到除了你说的小快简单之外解决 SpringBoot 的什么痛点,目前这个只能定位于 CRUD 框架
|
75
Zien 2020-08-04 00:55:39 +08:00
感觉不错的样子,简化很多,适合个人项目
|
76
retanoj 2020-08-04 08:55:06 +08:00 via iPhone
看到 lz 对 options 请求的回帖,我心态崩了。。
|
77
IfEles 2020-08-04 08:59:13 +08:00
先 star 支持一下
|
79
Joker123456789 OP @retanoj 怪我表达不清晰,我的意思是接口无法设置成 options,但是跨域时发出的那个 options 预判,是可以受理的。 我这里不支持的意思是 接口不受理,并不是请求不通。 也就是说服务是接受 options 的,只是接口不受理。 并不影响跨域。
|
80
Yuicon 2020-08-04 10:06:38 +08:00
感觉没啥区别 功能还少了 我特意多学一遍你这个是干什么 更别说开发者不尊重协议 搞非主流
|
81
Oktfolio 2020-08-04 10:23:01 +08:00
@Joker123456789 每次请求之前都会做一次 OPTIONS 请求( preflight ),返回 200 才会执行实际的请求。连 OPTIONS 都没实现,怎么执行实际请求?
|
82
Joker123456789 OP @Oktfolio 你可以 看倒数第三条评论,我已经解释过了。 就是你这条评论开始往上数,第二条,以 [怪我表达不清] 开头的那条。
|
83
OysterQAQ 2020-08-04 10:55:13 +08:00
作为自己学习项目还可以吧 自己写个去了解 aop 和 ioc 诸如能了解注解事务简单实现 但是我觉得在推给别人用之前还是得规模测试的 往往其实不在乎包大不大 而是运行效率以及开发效率 spring boot 效率是很高的
|
84
mdesi 2020-08-04 10:57:39 +08:00
可以自己玩玩,star 支持
|
85
shyling 2020-08-04 11:02:31 +08:00
不需要 Tomcat,不需要 JBoss,不需要 Netty,甚至连 Servlet 都不需要。
这 4 个不是一类东西吧。 |
86
Joker123456789 OP @shyling 确实不一类东西,但这个框架真的不需要啊。
现在主流的框架一般都是离不开 tomcat+servlet (框架底层使用 servlet 分发的),或者离不开 jboss+servlet,或者离不开 单独的 netty 。 |
87
janda 2020-08-04 11:08:00 +08:00
加油
|
88
yvestang 2020-08-04 13:38:57 +08:00
撸了下代码,质量一般,最起码的格式化都没做。
|
89
lolizeppelin 2020-08-04 13:40:56 +08:00
。。。。如果用不上 sprintboot 的生态为什么要吊死在 java 上呢
php 不好么 23333333333 |
90
bk201 2020-08-04 13:49:55 +08:00
就为了巨大化,对于现在的 server 开发来说无关痛痒,发力点有点不对。当然你要是 c 端开发另说。
|
91
cwjokaka 2020-08-04 13:59:44 +08:00
借鉴下
|
92
tzhhahaha 2020-08-04 14:03:36 +08:00
接楼问一下有人公司用 Vert.x 的吗
|
93
Joker123456789 OP @yvestang 你如果说用工具自动对齐的话,我确实没做,但你说没格式化,就有点瞎说了, 只能说没按你的喜好格式化。
|
94
JB18CM 2020-08-04 15:44:33 +08:00
jvm 占用内存 那么大,不用什么场景都用它吧,要不尝试下 go ?
|
95
yvestang 2020-08-04 16:22:47 +08:00
@Joker123456789 什么叫我的喜好,不说别的,看下 JDK 的格式?举例,方法签名的参数列表「逗号, 」后空格,你做到了么?
|
96
KevinBlandy 2020-08-04 16:25:44 +08:00
“Controller 基本上起到两个作用,一个是参数校验,一个是响应数据。” 我觉得 Controller 还是要干很多活儿的。
|
97
Joker123456789 OP @yvestang 要不晒一下您的代码? 我也来挑一挑 看看有没有刺。
|
98
cheng6563 2020-08-04 17:34:08 +08:00
Springboot 我就觉得 security 模块太大太丑了。其他都没感觉没啥问题。
|
99
yvestang 2020-08-04 18:03:01 +08:00
@Joker123456789 其一,我没有晒代码的义务和兴趣,我只能说在我们这个不入流的福报厂某部门,代码格式化是最基本的编码素养。其二,我晒不晒代码和你「代码的确没有格式化」有关系?
我发现你在这个贴下的很多回复都是这样喜欢转移话题,承认不足很难? |
100
Joker123456789 OP @yvestang
第一句代码: ``` public void abc(int a, int b){ for(int i = 0; i++; i < 10){ System.out.println(i); } } ``` 第二句代码: ``` public void abc(int a,int b){ for(int i=0; i++; i<10){ System.out.println(i); } } ``` 这两句代码,你有没有把第一句捧成神 我是不知道,但你确实把第二句贬成屎了。我承认第二句有不足,但他不是屎,ok ??? 还有啊,你在不在大厂跟我没关系。 |