这是一个大部分程序员都会产生的疑问,或者说质疑吧,Springboot那么好用,生态那么全,为什么要用这个刚出道的Mars-Java呢?
这篇文章就来聊一聊Mars-Java的一些特性。
首先如果要把这两个框架放在一起比较,那么毫无疑问,Springboot从技术和生态以及安全性上是碾压性的,但是如果抛开这些不谈呢?
你们一定觉得我在讲笑话,抛开技术,生态,安全性不谈,那这个框架还有啥用?连基本的都没了。 其实非也。
我们可以一个一个来讲。
技术比较
Springboot是基于Spring的二次封装,目的在于减少配置,而Spring是一群大神,花了好几年的时间维护过来的,并且经历了这么多年的实战运用,所以可谓是身经百战,经验丰富的一个框架了,他的算法和性能应该是得到了极致的优化(我猜的,其实没研究过源码)
而Mars-Java作为一个新兴的框架,自然在这两点上是处于下风的,但是我们都是用java实现的,用的是同一种技术:
Spring的MVC是基于servlet做得请求拦截,分发,并通过反射执行后面的java类,Mars-Java也是一样的原理
Spring的AOP是基于动态代理做的,Mars-Java也是一样的
Spring的IOC是通过反射被属性赋值,Mars-Java也一样
Spring有自己的JDBCTemplate,Mars-Java也有,而且功能比他更丰富
所以,我说的技术不如Spring,指的就是经验的差距,而这个可以通过时间来弥补,他缺的只是历练。
生态比较
这个就完全无法比了,一个团队花几年做得,跟Mars-Java这个新兴比,数量上就已经碾压了,更不用提什么成熟度了。
但是,Mars-Java有自己的分布式组件Mars-Cloud,以及正在开发的Mars-Config,后面也会一步步的优化和新增组件
同样,这个也是可以通过时间来弥补的。
安全性比较
虽然我在每次定版本之前,都会用一个专门的测试项目来测试所有的功能,确保不会出bug,但是毕竟缺乏大量的实战经验,所以这一点确实比不上Spring
这个问题,我正在进行单测的补充,确保覆盖率达到可交付标准
也就是说,Mars-Java目前就像一个实习生一样,很稚嫩,但是却有无限的可能,要是大家都来支持,一起完善,贡献代码,说不定会成为另一个生态。有竞争才有进步,老是被Spring垄断 就不好玩了。
说完了对比,接下来说一说Mars-Java的优点
一、 轻巧,简洁
这个点,几乎所有的开源项目都会声明一下,好像成了吹牛的标配,但是Mars-Java是真的简洁,我们平时开发一个中小型项目,如果用SpringBoot+Mybatis来做,会引入大量的Jar包,而Mars-Java起码少了一半依赖。
并且Mars-Java只提取了Springboot里常用的功能点,对于不常用的就直接丢弃了,比如:
Spring的bean支持Scope,而Mars-Java就只保留了单例
Spring支持所有连接池,所以需要有专门的代码来做兼容性,而Mars-Java直接内置druid,摒弃其他连接池
Spring可以跟大部分持久层框架整合,而Mars-Java只支持自己的持久层封装,摒弃其他的持久层框架。
这么做的目的在于 提供开箱即用的体验,让使用者不需要去纠结该使用什么,就是引入maven坐标,开始写代码,不需要去考虑用什么组合。
还有一个就是Mars-Java打算走的路线是轻巧的封闭式生态,而不是兼容所有东西的开放性生态。 但是这并不等于违背开源精神,因为Mars-Java生态的所有的项目都是开源的,任何人都可以免费用,可以看源码,可以贡献。 并且如果有第三方愿意兼容Mars-Java,我们也是非常欢迎的
二、 上手快
几乎保留了Spring的玩法,只要你会Spring,或者Springboot就可以快速地上手使用他了,这么做,肯定有人会觉得没意义,跟Spring一样,为什么不用Spring呢?
原因就在于,Mars-Java的核心理念是抽取常用的,抛弃不常用的,所谓取其精华。
在这个基础上,再去看看有没有自己的新玩法添加进来。
除了跟Spring玩法相似,我们的文档还是中文的(因为我只会中文,哈哈哈),所以不需要去百度了,直接来Mars-Java官网查看原汁原味的官方文档。
三、 新玩法
声明式API
这个可能不是我首创,但是我觉得很有意义,比如后端要开发一个接口,只需要这样:
先声明一下
@MarsApi(refBean = "expApiService")
public interface ExpApi {
/**
* get请求示例
* http://127.0.0.1:8080/expGetRequest?name=张三&names=王五&names=赵六
* @param expVO
* @return
*/
List expGetRequest(ExpVO expVO);
}
2. 实现这个接口就好
@MarsBean("expApiService")
public class ExpApiService implements ExpApi {
/**
* 为了让大家可以快速的跑起来,所以本示例没有连接数据库
* 所以自然也就不会调用dao的方法了,这里注入进来的,只是为了演示IOC的用法
*/ 郑州妇科医院那家好:http://www.zzyytj.com/郑州妇科医院哪里好:http://www.zzyytj.com/郑州治疗妇科哪家医院好:http://www.zzyytj.com/
@MarsWrite
private ExpDAO expDAO;
/**
* 这个方法上加了aop监听
* @param expVO
* @return
*/
@Override
@MarsAop(className = ExpAop.class)
public List expGetRequest(ExpVO expVO) {
// 打印expDAO,如果不为null就说明已经注入了
System.out.println(expDAO);
// 打印接收到的参数,看是否接收成功
System.out.println(expVO.getName());
System.out.println(JSON.toJSONString(expVO.getNames()));
// 返回数据
return getExpResultData();
}
}
对,你们没看错,Controller层没了,为什么会这样呢?这得从Controller的作用说起,在实际开发中,Controller基本上起到两个作用,一个是参数校验,一个是响应数据。
在Mars-Java中,参数校验被封装掉了,直接用注解即可,这个可以去官网看文档,响应数据,这个本来就没什么,直接返回就好,不需要去Controller里再返回一次了吧。
所以,干脆去掉了,让使用者专注在业务逻辑上。
其他新玩法
一行注解解决分布式锁
数据库单表操作不需要写sql
自带分页组件,直接调用即可
一个轻巧的,基于rest的分布式组件