阿里云代理商-阿里云服务器-阿里云数据库-重庆典名科技

Springboot挺好的,为什么要用Mars-Java

发布时间: 2020-07-08 16:49:30文章作者: 网站编辑阅读量: 258
    这是一个大部分程序员都会产生的疑问,或者说质疑吧,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")
    publicinterfaceExpApi{
    /**
    *get请求示例
    *http://127.0.0.1:8080/expGetRequest?name=张三&names=王五&names=赵六
    *@paramexpVO
    *@return
    */
    List<ExpVO>expGetRequest(ExpVOexpVO);
    }

    2.实现这个接口就好
    
@MarsBean("expApiService")
    publicclassExpApiServiceimplementsExpApi{
    /**
    *为了让大家可以快速的跑起来,所以本示例没有连接数据库
    *所以自然也就不会调用dao的方法了,这里注入进来的,只是为了演示IOC的用法
    */
    @MarsWrite
    privateExpDAOexpDAO;
    /**
    *这个方法上加了aop监听
    *@paramexpVO
    *@return
    */
    @Override
    @MarsAop(className=ExpAop.class)
    publicList<ExpVO>expGetRequest(ExpVOexpVO){
    //打印expDAO,如果不为null就说明已经注入了
    System.out.println(expDAO);
    //打印接收到的参数,看是否接收成功
    System.out.println(expVO.getName());
    System.out.println(JSON.toJSONString(expVO.getNames()));
    //返回数据
    returngetExpResultData();
    }
    }

    对,你们没看错,Controller层没了,为什么会这样呢?这得从Controller的作用说起,在实际开发中,Controller基本上起到两个作用,一个是参数校验,一个是响应数据。
    在Mars-Java中,参数校验被封装掉了,直接用注解即可,这个可以去官网看文档,响应数据,这个本来就没什么,直接返回就好,不需要去Controller里再返回一次了吧。
    所以,干脆去掉了,让使用者专注在业务逻辑上。
    其他新玩法
    一行注解解决分布式锁
    数据库单表操作不需要写sql
    自带分页组件,直接调用即可
    一个轻巧的,基于rest的分布式组件
联系客服免费领取更多阿里云产品新购、续费升级折扣,叠加官网活动折上折更优惠