读阿里巴巴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开发之 包含EditText组件 禁止自动获取焦点弹出输入法
在EditText标签的外层Layout中加入focusableInTouchMode属性 android:focusableInTouchMode="true" 即可.
- ios坐标位置转换
//ios常用坐标转换来处理一些下拉框队形的按钮的位置,我以最下面两个来进行一下个人的理解,不足之处多多见谅 - (CGPoint)convertPoint:(CGPoint)point toView ...
- Python练习册 第 0013 题: 用 Python 写一个爬图片的程序,爬 这个链接里的日本妹子图片 :-),(http://tieba.baidu.com/p/2166231880)
这道题是一道爬虫练习题,需要爬链接http://tieba.baidu.com/p/2166231880里的所有妹子图片,点进链接看一下,这位妹子是日本著名性感女演员--杉本由美,^_^好漂亮啊,赶紧 ...
- preg_*匹配的字符串长度限制问题以及nginx,php上传文件过大问题
问题背景 使用插件上传高清图片,用的插件base64转码的,上传失败,接口提示:413 (Request Entity Too Large) 问题分析与解决 首先想到的是nginx和php的服务器配 ...
- 代码编写规范说明书(c#.net与asp.net)
代码编写规范说明书(c#.net与asp.net) 目 录1 目的2 范围3 注释规范3.1 概述3.2 自建代码文件注释3.3 模块(类)注释3.4 类属性注释3.5 方法注释3.6 代码间注释4 ...
- STM32学习笔记(一)——点亮一个LED
引言 最近报名了2017全国大学生电子设计竞赛,我们学校是第一次参加这个比赛,由于8/9月份就要比赛了,所以现在准备是比较晚的了,指导老师说只能做控制类的题目了,让我们学习一下STM32单片机,51到 ...
- 通过修改CoreCLR中的ClrHost实现自托管程序
上一篇我们讲了如何在windows和Linux上编译CoreClr的问题 虽然文章使用的是windows 10 (Bash)环境,但是也可以做为ubuntu环境的参考. 成功编译CoreCLR的源代码 ...
- node.js前后台交互示例 -- 使用node.js实现用户注册功能
node.js环境自行搭建,参考菜鸟教程的node.js就可以. 1 通过ajax提交index.html中form表单 register.html文件如下: <!doctype html> ...
- java多线程基本概述(七)——join()方法
在很多情况下,主线程创建并启动子线程,如果子线程中有大量的耗时运算,主线程将早于子线程结束,如果想让主线程等待子线程结束后再结束,那么我们可以使用join()方法.调用join()方法的意思是当前线程 ...
- 在c++中,标准输入string时cin 与getline两个函数之间的区别
cin: cin函数是标准库的输入函数,在读取string时遵循以下规则: 1)读取并忽略开头所有的空白符(包括空格.换行符.制表符). 2)读取字符直到遇到空白符,读取终止. 例如: 当输入的是“ ...