我的编码习惯 - Controller规范
原文出处: 晓风轻
请先阅读我这2篇文章 程序员你为什么这么累? 和 我的编码习惯 - 接口定义。
第一篇文章中,我贴了2段代码,第一个是原生态的,第2段是我指定了接口定义规范,使用AOP技术之后最终交付的代码,从15行到一行,自己感受一下。今天来说说大家关注的AOP如何实现。
先说说Controller规范,主要的内容是就是接口定义里面的内容,你只要遵循里面的规范,controller就问题不大,除了这些,还有另外的几点:
1. 所有函数返回统一的ResultBean/PageResultBean格式
原因见我的接口定义这个贴。没有统一格式,AOP无法玩。
2. ResultBean/PageResultBean是controller专用的,不允许往后传!
3. Controller做参数格式的转换,不允许把json,map这类对象传到services去,也不允许services返回json、map。
一般情况下!写过代码都知道,map,json这种格式灵活,但是可读性差,如果放业务数据,每次阅读起来都比较困难。定义一个bean看着工作量多了,但代码清晰多了。
4. 参数中一般情况不允许出现Request,Response这些对象
主要是可读性问题。一般情况下。
5. 不需要打印日志
日志在AOP里面会打印,而且我的建议是大部分日志在Services这层打印。
规范里面大部分是 不要做的项多,要做的比较少,落地比较容易。
ResultBean定义带泛型,使用了lombok。
AOP代码,主要就是打印日志和捕获异常,异常要区分已知异常和未知异常,其中未知的异常是我们重点关注的,可以做一些邮件通知啥的,已知异常可以再细分一下,可以不同的异常返回不同的返回码:
public class ControllerAOP {
private static final Logger logger = LoggerFactory.getLogger(ControllerAOP.class);
public Object handlerControllerMethod(ProceedingJoinPoint pjp) {
long startTime = System.currentTimeMillis();
ResultBean<?> result;
try {
result = (ResultBean<?>) pjp.proceed();
logger.info(pjp.getSignature() + "use time:" + (System.currentTimeMillis() - startTime));
} catch (Throwable e) {
result = handlerException(pjp, e);
}
return result;
}
private ResultBean<?> handlerException(ProceedingJoinPoint pjp, Throwable e) {
ResultBean<?> result = new ResultBean();
// 已知异常
if (e instanceof CheckException) {
result.setMsg(e.getLocalizedMessage());
result.setCode(ResultBean.FAIL);
} else {
logger.error(pjp.getSignature() + " error ", e);
result.setMsg(e.toString());
result.setCode(ResultBean.FAIL);
// 未知异常是应该重点关注的,这里可以做其他操作,如通知邮件,单独写到某个文件等等。
}
return result;
}
}
AOP配置:(关于用java代码还是xml配置,这里我倾向于xml配置,因为这个会不定期改动)
<!-- aop -->
<aop:aspectj-autoproxy />
<beans:bean id="controllerAop" class="xxx.common.aop.ControllerAOP" />
<aop:config>
<aop:aspect id="myAop" ref="controllerAop">
<aop:pointcut id="target"
expression="execution(public xxx.common.beans.ResultBean *(..))" />
<aop:around method="handlerControllerMethod" pointcut-ref="target" />
</aop:aspect>
</aop:config>
现在知道为什么要返回统一的一个ResultBean了:
- 为了统一格式
- 为了应用AOP
- 为了包装异常信息
分页的PageResultBean大同小异,大家自己依葫芦画瓢自己完成就好了。
贴一个简单的controller(左边的箭头表示AOP拦截了)。请对比程序员你为什么这么累?里面原来的代码查看,没有对比就没有伤害。

最后说一句,先有统一的接口定义规范,然后有AOP实现。先有思想再有技术。技术不是关键,AOP技术也很简单,这个帖子的关键点不是技术,而是习惯和思想,不要捡了芝麻丢了西瓜。网络上讲技术的贴多,讲习惯、风格的少,这些都是我工作多年的行之有效的经验之谈,望有缘人珍惜。
觉得有用请点赞加关注,接下来再继续其他规范。敬请期待。
我的编码习惯 - Controller规范的更多相关文章
- 程序员你为什么这么累【三】:编码习惯之Controller规范
作者:晓风轻本文转载自:https://zhuanlan.zhihu.com/p/28717374 第一篇文章中,我贴了2段代码,第一个是原生态的,第2段是我指定了接口定义规范,使用AOP技术之后最终 ...
- C#与Java对比学习:类型判断、类与接口继承、代码规范与编码习惯、常量定义
类型判断符号: C#:object a; if(a is int) { } 用 is 符号判断 Java:object a; if(a instanceof Integer) { } 用 inst ...
- Python编码规范(养成好的编码习惯很重要)
学习过程养成良好的编码习惯 1. 类名采用驼峰命名法,即类名的每个首字母都大写,如:class HelloWord,类名不使用下划线 2. 函数名只使用小写字母和下划线 3.定义类后面包含一个文档字符 ...
- 好的android编码习惯
上一期分享了android内存优化的一些总结,这一期说说我认为的好的编码习惯,然后下一期会做安卓数据库优化的一些总结,逐渐的会将一些性能优化点总结分享出来,肯定是不够全面的希望不足的地方欢迎指出. 良 ...
- ios开发之--编码及命名规范
做了几年的开发工作,因为是半路出的家,所以对这块一直都没怎么重视,所以在工作中,出现了很多的尴尬场景,编码和命名的规范是一定得有的,最起码一个团队之间的规范也是很有必要的.面向对象的编程,其实很好理解 ...
- 程序员你为什么这么累? - Controller规范
导读:程序员你为什么这么累? 接口定义:程序员你为什么这么累? - 接口定义 第一篇文章中,我贴了2段代码,第一个是原生态的,第2段是我指定了接口定义规范,使用AOP技术之后最终交付的代码,从15行到 ...
- C#编码标准--编码习惯
C#编码标准--编码习惯 0. 书写程序时的大小写规则: a) 类:PascalCase表示法.如 MyClass b) 枚举值:PascalCase表示法.如 Colors.Red c) 枚举类型 ...
- kotlin 语言入门指南(三)--编码习惯
这章主要讲当前 kotlin 的一些编码习惯. 命名 如无疑问,kotlin 的命名风格与以下的java风格一样: --驼峰命名法(不要使用下划线) --类名首字母大写 --方法和属性名首字母小写 - ...
- 测试不得不知的python编程小技能-----升级版基础语法和优秀的编码习惯
编程和学习python,最后快速上手.能写小工具,写自动化用例这类要求对鹅厂的测试人员来说都是一些基础的必备素质,但是一个优秀的测试,也是有着一颗开发完美测试工具的心的.但是罗马不是一天构建成,特别是 ...
随机推荐
- 复杂PC问题——信号量与共享存储区
#include <stdio.h> #include <unistd.h> #include <sys/ipc.h> #include <sys/sem.h ...
- 《TCP/IP 详解 卷1:协议》第 11 章:名称解析和域名系统
引言 到目前为止,我们使用 IP 地址来研究参与网络的主机.对于大众来说,这些地址太繁琐且难以记忆.为了使用如 TCP 和 IP 等协议,主机名称通过名为名称解析(name resolution)的过 ...
- 简单实现wc.exe软件基本功能
简单实现wc.exe软件基本功能 软件需求分析: 一.基本功能 支持 -c 统计字符数(char count) 支持 -w 统计单词数(word count) 支持 -l 统计总行数(line ...
- js中的let\var\const
在JavaScript中有三种声明变量的方式:var.let.const.下文给大家介绍js中三种定义变量的方式const, var, let的区别. 1.const定义的变量不可以修改,而且必须初始 ...
- 第九周(11.11-11.17)----Beta版本发布140字评论
1.新蜂组: 俄罗斯方块:项目有良好的用户界面,在原版的基础上可以对用户分数进行排序,增加了显示下一个方块的功能.是个很有趣的小游戏. 2.天天向上组: 连连看:完成了基本功能,增加了消除时和鼠标点击 ...
- VMIC
1. wmic 的简介 wmic -? [全局开关] <命令> 可以使用以下全局开关: /NAMESPACE 别名在其上操作的命名空间的路径. /ROLE 包含别名定义的角色的路径. /N ...
- [转帖]sqlnet.ora常用参数
sqlnet.ora常用参数 注﹕在修改sqlnet.ora文件之后重新启动监听﹐修改才能生效﹗﹗﹗ oracle网络设置主要包括三个文件,sqlnet.ora\ lisnter.ora\ tnsna ...
- ZooKeeper-基础介绍
What is ZooKeeper? ZooKeeper为分布式应用设计的高性能(使用在大的分布式系统).高可用(防止单点失败).严格地有序访问(客户端可以实现复杂的同步原语)的协同服务. ZooKe ...
- Redis 基础:Redis 事件处理
Redis 事件处理 Redis服务器是一个事件驱动程序,服务器需要处理以下两类事件: 文件事件(file event):Redis服务器通过套接字与客户端(或其他Redis服务器)进行连接,而文件事 ...
- C++模板学习笔记
一个有趣的东西:实现一个函数print, 输入一个数组, 输出数组的各个维度长度. eg. ], b[][], c[][][]; print(a); //(2, 4) print(b); //(3, ...