读阿里巴巴Java开发手册v1.2.0之工程结构有感【架构篇】
首先,把昨天那俩条sql语句的优化原因给大家补充一下,第一条效率极低,第二条优化后的,sql语句截图如下:
经过几个高手的评论和个人的分析:
第一条sql语句查询很慢是因为它首先使用了in关键字查询,导致全表扫描,其次我那条sql语句的写法上,是通过子查询根据某一个字段去不断匹配后面查询到的集合数据,最后得到查询结果,这一系列操作下来效率上去才怪呢。
但是第二条sql语句是通过连接查询,根据建立了索引的字段来等值匹配,最后得到查询结果,速度杠杠的。(一次小小的优化经历,学到了)。
今天(2017-05-24)在微信公众号上终于等到阿里巴巴集团开源的Java开发手册更新了,从地铁上一路看到公司,真的学到了,人家的开发规约真的是好,讲的很细,很注重细节,这就是差距啊,下面给大家简单总结一下吧(手册原件如果需要,请留言)。
它的名字是《阿里巴巴Java开发手册v1.2.0》,距2017-02-09发布的第一版已经有6个历史了,它的总体结构分为五大部分:编程规约、异常日志、MySQL数据库、工程结构和安全规约。今天我主要给大家分享总结了工程结构,因为我五一前刚给公司开发了一套内网数据录入系统,虽然没用到什么大的框架和潮流的技术,但是麻雀虽小五脏俱全啊。包括表结构、工程搭建和业务梳理都是自己一个人在开发,当时在开发的时候也是感觉很孤独,因为项目组的其他人都有战友配合作战,而我就一个人,还有页面的调试和美化都是我一个人在搞,在此声明一下,我不是在抱怨,反而很珍惜这种开发机会,真的会沉淀很多东西,谢谢公司。
切入正题吧,今天给大家分享的是工程结构这块的一些个人总结。
1、项目应用分层:
这里主要给我们讲述了一下,一个项目理想化的项目架构图,和我们平时开发的项目结构稍稍不同,毕竟人家的架构思维那是相当的高啊,这还是最基础的架构图呢。
上图默认上层依赖于下层,箭头关系表示直接依赖。
开放接口层:可直接封装service层接口中的方法暴露成RPC接口/服务,通过web封装成http接口,最后进行网管控制、流量控制等。
终端显示层:各个端的模板渲染并执行显示的层。当前我们主要接触的是js渲染、jsp渲染和移动端渲染等。
web层:主要是对访问控制进行转发,各类基本参数校验,或者不复用的业务简单处理等。
service层:相对具体的业务逻辑服务层。
manager层:通用业务处理层,它有如下特征:1、对第三方平台封装的层,预处理返回结果及转化异常信息;2、对service层通用能力的下沉,比如缓存方案、中间件通用处理、3、与dao层交互,对多个dao的组合复用。
dao层:数据访问层,与底层MySQL、Oracle、hbase数据库进行数据交互。
外部接口或第三方平台:包括其他部门的rpc接口,基础平台,其他公司的http接口。
以上都是阿里项目的工程架构,有一点不同的是我们平时通用的是controller层、service服务层和dao数据访问层,但是他们这里提出了manager层,将一些业务通用的处理方式和需要多个dao组合复用的结果抽取到该层,个人感觉在项目维护上很方便,以前我们都是按模块划分,将各个模块的业务逻辑都往service层堆上去,这样其实也没什么不好,但是我们感觉试着将业务层通用的业务抽取一下,刚才还琢磨着把我前俩天写的项目重构一下,最后还是等到端午吧,也好好模仿一把阿里,哈哈哈。
2、项目异常分层处理规约:
因为dao数据访问层产生的异常很多,类型也很多,无法用细粒度的异常进行处理,所以直接将异常丢给service层,为啥要将数据访问层的异常丢到manager/service层,因为通常在manager/service层中会有日志打印,不管是发生异常还是异常抛出,都会时刻记录运行情况到日志文件中去,要是刚才在dao层也将异常打印,又因为dao和service是同台服务器,这样就相当于打印了2次日志,浪费性能和储存。
service产生的异常必须记录到磁盘日志文件中去,尽可能带上参数信息,相当于保护案发现场。
web层大哥们,不能在爽啦,必须处理了,如果产生的异常会导致页面的正常渲染,则采用拦截器或异常处理的方式,跳转到异常错误友好页面,加上友好的错误提示信息,最后还要在开发接口层将产生的异常处理成错误码和错误信息返回。
3、分层领域模型规约:
我们以前的项目中我见过有3类模型类,第一类是web层与视图层传递参数的query类,第二类是与数据表对应的pojo类,第三类是为了响应数据定义的扩展vo类。
下面我们来看看阿里是如何将模型进行规约的,我感觉非常啰嗦但是非常好,其实很多电商公司也估计是这么做的,我之前接触的一个电商项目大概就是这种设计,好长时间了记不清了:
DO(data object):与数据库中的数据表一一对应,通常是应用于数据访问层dao中用于向上传输数据源对象。
DTO(data transfer object):数据传输对象,该模型类主要是应用于service层和manager层,将service层和manager层业务处理后进行向外传输对象。
BO(business object):业务对象,主要是service层输出的封装的业务逻辑的对象。
Query:数据查询对象,各层接受上层传递过来的多个参数并将这些参数封装到query对象中。
VO(view object):视图层对象,主要是web层向视图层传输的数据对象。
4、二方库依赖:
定义GAV遵从一下规则:
(1)、GroupID格式:com.{公司/BU}.业务线.[子业务线],最多四级。
(2)、ArtifactID格式:产品线名-模块名。注意:语意不重复不遗漏,最好到中央仓库中去查证一下。
(3)、Version格式:版本号根据自己公司的规定。
最后给大家送上几条建议,也是在手册中看到的,只不过写到这儿印象比较深刻,还没忘就给大家写在这儿吧:
一:数据订正时,在调用修改和删除方法之前,最好先查询要修改或删除的记录是否存在,确认无误后再进行更新。
二:在查询数据时能避免使用IN关键字就避免,是在避免不了,则需要仔细评估IN后边的数据集合中总数是否超过1000,最好控制在1000以内,我上次的优化经历起源于它,就是匹配的集合数据远远超过1000条,最后导致查询效率极低。
三:sql.xml文件中配置参数尽量使用#{},尽量不要使用${},容易造成sql注入问题。
四:接口过时必须加@Deprecated注释,并且添加注释清晰地说明替代旧接口的新接口或服务。
五:一般不要在pojo类中定义属性的变量时,建议不要加is前缀,但是在数据表中定义属性对应的字段是尽量加上is_前缀,原因是:如果在给属性的变量名加上is前缀极可能会发生,部分框架解析时会引起序列化错误。
六:在定义项目中的包结构时,统一使用小写并单数形式。
七:service层和mapper接口中定义的方法,建议不要写修饰符,目的就是代码结构看着简单,阿里给出的解释,所以我就把我以前的都删掉了,好习惯就应该从现在开始。
八:如果项目中要实现分页逻辑,如果在判断总记录数为0时,则直接返回,避免执行后面的分页语句,给大家送张截图,是我前几天自己写的分页逻辑:
@Override
public List<Task> findOrdersByUserId(Task task,Page page) {
int count = vinTaskMapper.countOrdersByUserId(task);
page.setMaxRow(count);
if(count == 0){
return new ArrayList<Task>();
}
return vinTaskMapper.findOrdersByUserId(task,page);
}
九:禁止使用存储过程,因为难以调试和扩展,更没有移植性。
好了,就总结到这儿吧,这里虽然没什么干货和技术要点,但是我的目的是给大家分享一点编程习惯,具备好的代码风格是作为一个优秀程序员的基本素能,最后希望大家写出来的代码能够越看越美,越看越想看,哈哈哈。
读阿里巴巴Java开发手册v1.2.0之工程结构有感【架构篇】的更多相关文章
- 读阿里巴巴Java开发手册v1.2.0之编程规约有感【架构篇】
不为过去蹉跎,改变当下. 为什么开篇就送这么一句话给大家,我相信很多处于1-3年码龄的哥们儿们,在平时的编码历程中编码的个性可能是多彩的,每个人都有每个人特定的风格,但是我们现在这么随意写,以后这么 ...
- 《阿里巴巴Java开发手册v1.2》解析(编程规约篇)
之前在乐视天天研究各种底层高大上的东西,因为我就一个人,想怎么弄怎么弄.如今来了新美大,好好研读一下<阿里巴巴Java开发手册v1.2>.还要对这么看似简单的东西解析一番.毕竟现在带团队, ...
- 阿里巴巴 Java开发手册1.4.0
<阿里巴巴Java开发手册1.4.0>下载地址: 下载地址:https://102.alibaba.com/downloadFile.do?file=1528269849853/Java_ ...
- 码出高效,阿里巴巴JAVA开发手册1.4.0
码出高效,阿里巴巴JAVA开发手册1.4.0阅读笔记 一.编程规约(三) 代码格式// 关键词if与括号之间必须有一个空格,括号内的f与左括号,0与右括号不需要空格 if (flag == 0) { ...
- 【阿里巴巴Java开发手册1.7.0(嵩山版)】编程规约&MySQL 数据库规约
阿里巴巴Java开发手册1.7.0(嵩山版) 一.编程规约 (一)命名风格 所有命名不得以下划线和$开始和结束. 所有命名不得以拼音或拼音英文混合. 类名使用UpperCamelCase风格. 方法名 ...
- 304902阿里巴巴Java开发手册1.4.0
转自官网 前言 <阿里巴巴Java开发手册>是阿里巴巴集团技术团队的集体智慧结晶和经验总结,经历了多次大规模一线实战的检验及不断完善,系统化地整理成册,回馈给广大开发者.现代软件行业的高速 ...
- 《阿里巴巴Java开发手册1.4.0》阅读总结与心得(一)
前言 下面是阿里对<阿里巴巴 Java 开发手册>(下称<手册>)的介绍: 凝聚了阿里集团很多同学的知识智慧和经验,这些经验甚至是用血淋淋的故障换来的,希望前车之鉴,后车之师, ...
- 《阿里巴巴Java开发手册1.4.0》阅读总结与心得(五)
笔者作为一名有数年工作经验的Java程序员,仔细研读了这份手册,觉得其是一份不可多得的好材料.阿里巴巴在发布时所说,“阿里巴巴集团推出的<阿里巴巴Java开发手册(正式版)>是阿里巴巴近万 ...
- 《阿里巴巴Java开发手册1.4.0》阅读总结与心得(四)
(七)设计规约 1. [强制] 存储方案和底层数据结构的设计获得评审一致通过,并沉淀成为文档. 说明: 有缺陷的底层数据结构容易导致系统风险上升,可扩展性下降,重构成本也会因历史数据迁移和系统平滑过渡 ...
随机推荐
- Android报错:WindowManager$BadTokenException: Unable to add window -- window has already been added
很久之前测试通过的代码,现在手机升级了Android7.0后一运行就崩溃,报出这样的错误,具体错误如下: Process: com.example.sho.android_anti_theft, PI ...
- ubuntu 14.04 64位安装HTK3.5
1.http://htk.eng.cam.ac.uk/download.shtml 官网下载HTK source code以及HDecode 2.分别解压HTK-3.5.beta-2.tar.gz.H ...
- iOS图片填充UIImageView(contentMode)
本文主要形象的介绍一下UIView的contentMode属性: 核心代码 [self.prp_imageView setContentMode:UIViewContentModeScaleAspec ...
- 表单的序列化ajax
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- UEFI+GPT下安装Win10+Ubuntu16.04双系统
安装环境 SSD+HDD双盘,Win10安装在SSD里,HDD分出来60G安装Ubuntu. 自行百度你的主板是否支持UEFI启动方式. Win10 下载Win10安装镜像.烧盘等步骤就不说了,重启后 ...
- Apache+mod_encoding解决URL中文编码问题
我们经常在论坛上看到这样的求救贴: 为什么我看不了网站上中文文件名的文件?这时一定会有好心的大侠告诉说,到IE6的工具,Internet选项, 高级里,把"总是以UTF-8发送URL&qu ...
- Swift中枚举的总结以及使用
枚举定义了一组具有相关性的数据,是开发者可以再带吗中以一个安全的方式来使用这些值,以又助于提供代码的可读性. 在Swift中,枚举可以分成两种:任意类型的枚举和指定类型的枚举,结构如下: //任意类型 ...
- position relative
position的默认值是static,(也就是说对于任意一个元素,如果没有定义它的position属性,那么它的position:static) 如果你想让这个#demo里的一个div#sub相对于 ...
- D3D中一些接口的变化和VS配置关联的方法
一.一些改变 #include <xnamath.h> 改为了 #include <DirectXMath.h> 二.vs关联 步骤: 1.选择工程的Properties, 2 ...
- onmouseover事件
根据教学视频写了个onmouseover事件: <!DOCTYPE html> <html> <head> <meta charset="UTF-8 ...