- 浏览: 813868 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
107x:
不错,谢谢!
log4j.properties配置详解 -
gzklyzf:
为啥我解析的PDF文档没有作者、文章题目等信息啊,下面是我的代 ...
Apache Lucene Tika 文件内容提取工具 -
mervyn1024:
解压密码是啥
ictclas4j调整 -
百卉含英:
如果我的文件输出路径是这个log4j.appender.Fil ...
log4j.properties配置详解 -
lxhxklyy:
mark……
log4j.properties配置详解
zz自:http://www.iteye.com/topic/606348
<script type="text/javascript"></script>马上要告别研发了,所以写一些自己积累的经验,用来纪念4年的似水流年,本篇为第一张,用来介绍自己是如何写Service的,当然我总结的不一定合理,大家一起讨论下。
笔者认为,Service及服务层,服务可以分为功能服务和业务服务,功能服务不易改变,业务服务易改变。所以功能服务添加得多,修改的少,那么我们可以考虑不使用接口。而业务服务,修改和更新都很频繁,所以应该提取接口,用不同的实现来屏蔽业务逻辑。
1:使用断言控制输入。
使用断言来判断有效的输入,这样能够避免异常的扩散,迅速定位错误和减少BUG出现的几率。
如:
- import org.springframework.util.Assert;
import org.springframework.util.Assert;
- private boolean addAttachment(Attachment att) {
- Assert.notNull(att, "att对象不能为空");
- }
private boolean addAttachment(Attachment att) {
Assert.notNull(att, "att对象不能为空");
}
要学会灵活运用断言,不仅仅是用来断言来判断方法的输入参数是否正确,还可以判断业务逻辑,每次方法调用的输入输出,至于何时使用需要自己根据方法自我判断。
2:只抛出RumtimeException
作为service层,自己不清楚调用方到底是谁,也不知道调用方如何使用自己的接口,那么自己写出的接口最好是抛出RumtimeException,这样调用方能够处理这个异常或者觉得处理这个异常有必要的话,就进行处理。如果使用Exception就得强制那些处理不了的调用方继续向外抛出。抛出RumtimeException的时候需要在注释里申明我抛出了该异常。
- throw new RuntimeException("工作流初始化失败!");
throw new RuntimeException("工作流初始化失败!");
3:在Service层做事务处理
大家都知道Service层一般是用来组合DAO,所以经常出现需要事务处理的地方,笔者建议尽量在service层做事务处理。
因为一般业务逻辑都屏蔽在service层。笔者习惯使用Spring的手动事务。
- new TransactionTemplate(transactionManager).execute(new TransactionCallbackWithoutResult() {
- protected void doInTransactionWithoutResult(TransactionStatus status) {
- //调用DAO按照ID删除部门
- }
- });
new TransactionTemplate(transactionManager).execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
//调用DAO按照ID删除部门
}
});
4:Service接口的异常处理
对于程序异常,service能够处理的自己处理(将异常封装成自己的异常,再向外抛出也算一种处理),不能处理的继续向外抛出。
对于业务异常,以前开发的时候都会向外抛出一个用户友好的运行时异常,这种异常信息是能够直接展现给用户的,如“您添加的用户名已经存在!”,但是现在考虑到国际化,所以觉得Service的接口应该抛出错误代码,定义一个友好错误代码运行时异常,在程序出现条件错误的时候抛出错误代码。错误代码可以定义一个枚举类来实现。
- /**
- * 错误代码定义
- *
- * @author fangtengfei
- * @date 2010-3-3
- */
- public enum ErrorCode {
- /**
- * 用户不能重复
- */
- User_Not_Repeat,
- /**
- * 用户名太长
- */
- User_Name_Too_Long
- }
/**
* 错误代码定义
*
* @author fangtengfei
* @date 2010-3-3
*/
public enum ErrorCode {
/**
* 用户不能重复
*/
User_Not_Repeat,
/**
* 用户名太长
*/
User_Name_Too_Long
}
- 在Service里抛出:throw new FriendlyCodeRuntimeException(ErrorCode.User_Not_Repeat.toString());
在Service里抛出:throw new FriendlyCodeRuntimeException(ErrorCode.User_Not_Repeat.toString());
5:必须记录日志
大家都知道,记录日志的目的,主要是当程序运行在不同的环境下,使用日志来监控程序的运行,有些异常可能会特定的环境发生,而这种环境不容易被重现,所以此时唯一能定位问题的途径就只有日志。
Service层会被各种调用方使用,特别是对外提供Service,环境更会前差万别,如何迅速并有效的定位错误变得尤其重要,所以必须记录有效的日志。
- logger.error("更新文档出现出错", e);
logger.error("更新文档出现出错", e);
6:写有效的注释
之所以说写有效的注释,是因为有时候,有些方法真的不需要写注释,如addUser,就不要在写注释“添加用户”这样的注释。关键是写有效的注释,注释的作用在于,调用方只看注释而不看代码就能知道如何使用接口,注释应该包括:输入参数的注释,输出参数的注释和异常的注释。特别是List<Map>,Sting[]这样的参数要严格说明,笔者认为Service作为一个核心层,注释必须非常详细。另外直观的方法名也能起到注释的作用。
- /**
- * 批量添加文档的附件
- *
- * @param att 附件对象,附件名长度为20,附件大小为10M
- * @throws FriendlyCodeRuntimeException
- */
- private void addAttachment(Attachment... attachment)
/**
* 批量添加文档的附件
*
* @param att 附件对象,附件名长度为20,附件大小为10M
* @throws FriendlyCodeRuntimeException
*/
private void addAttachment(Attachment... attachment)
发表评论
-
保留两位小数
2012-01-13 20:48 1397public static String Baoliu(do ... -
Java 水印
2011-08-27 23:18 1160import java.awt.Color; import ... -
好好看文档
2011-08-16 21:12 1100作为上位机下位机通讯的接口,老z托我写个示例程序。我误以 ... -
中文超链接乱码解决一例(2)
2011-01-07 23:26 2259View层 <%@ page language= ... -
中文超链接乱码解决一例
2010-12-28 22:31 1483中文超链接乱码解决一例 服务器端: St ... -
JVM参数与性能优化
2010-04-17 11:33 1639JVM参数与性能优化 在很多地方都会用到 ... -
ImageMagic
2010-03-10 11:09 1653ImageMagic ImageMagick是一套稳定 ... -
java 修改 Windows 注册表zz
2010-03-08 13:49 1459java 修改 Windows 注册表 项目中用到,整 ... -
BlockingQueue
2010-01-26 12:07 3512public interface BlockingQueue& ... -
ieee754的浮点数问题
2010-01-13 16:16 1352ieee754的浮点数问题 我们在用java的浮 ... -
dbutils入门
2010-01-11 15:49 1564DButils隶属于apache commons,对于一些基本 ... -
每个项目中,你不得不知的11个Java第三方类库
2010-01-05 16:36 1312每个项目中,你不得不 ... -
Java 获得文件编码格式
2009-12-07 15:03 1637Java 获得文件编码格式 转的,不丢人。 imp ... -
反序列化代码……备忘一下……
2009-11-23 21:25 1327package before; import java. ... -
Java反编译工具 jad
2009-10-15 20:11 2729Java反编译工具 jad Java下的一个简单易用的 ... -
log4j.properties配置详解
2009-10-14 11:16 70344log4j.properties配置详解 一、Log4 ... -
java代码保护
2009-08-18 21:16 25951.Java反编译工具:Java Decompiler(JD) ... -
接口和抽象类实例
2009-07-24 10:16 2979以下是抽象类: /** * * 抽象类 ... -
java中的抽象类和接口
2009-07-24 10:01 1119转自:http://www.7880.com/Info/Art ... -
java培训*注意的几点
2009-07-21 14:10 15051. 为什么要用空格缩进。 以前使用 DW 习惯 ...
相关推荐
zz-doctor应用可能利用自定义控件、主题样式和动画来提升用户体验。 最后,考虑到应用的性能和电量消耗,开发者需要关注内存管理、线程优化、图片加载策略等。例如,使用异步加载技术(如AsyncTask或Retrofit的异步...
1. **Android应用开发**:了解Android应用程序的基本架构,包括Activity、Service、BroadcastReceiver、ContentProvider等组件的使用。 2. **Java编程**:Android应用主要用Java语言编写,因此需要掌握Java的基础...
《Android应用源码zz-doctor中医大夫助理信息系统详解》 在深入探讨Android应用源码zz-doctor中医大夫助理信息系统之前,我们先理解一下这个项目的背景和目标。此项目旨在为中医大夫提供一个辅助信息系统,通过...
同时,`style.xml`定义了应用的样式和主题。 6. **权限管理**:如果应用需要访问用户的健康数据或者联网,就需要在`AndroidManifest.xml`中声明相应的权限。例如,`READ_EXTERNAL_STORAGE`用于读取文件,`INTERNET`...
### 推荐一本《Linux学习笔记》的知识点详解 #### 第一章 Linux简介及安装 **一、Linux介绍** - **Linux起源与定义**:Linux 是由芬兰大学生 Linus ...随着深入学习,还可以进一步探索更多高级主题和技术细节。
根据给定文件内容,本报告将围绕“BOOT_COMPLETED issue analysis report”这一主题,详细阐述Android系统中与POWER键相关的开机完成(BOOT_COMPLETED)广播事件处理机制,以及为何在特定情况下会出现问题。...
* 抽象:抽象是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象包括两个方面,一是过程抽象,二是数据抽象。 * 继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,...
2. `eclipse-jee-juno-SR1-win32-x86_64.zip`:这是Eclipse Java EE版本的Juno Service Release 1的64位Windows版本。Eclipse有多个版本,其中Java EE版专为Web和企业级Java应用开发设计,包含了额外的插件和支持。 ...
该主题聚焦于实际应用中的技术问题解决过程,涉及编码器信号处理与PLC(可编程逻辑控制器)编程技术等关键知识点。 ### 一、PLC基础概念 PLC是一种专为工业环境下使用的数字运算操作电子系统,它采用一种可编程的...