最先接触hibernate关于业务的操作都是通过session操作的,好长时间没有用,再去看代码的时候发现一些看不懂的地方。先看看代码
return (List) this.getHibernateTemplate().execute(
new HibernateCallback()
{
public Object doInHibernate(Session session)
throws HibernateException, SQLException
{
Query query = null;
query = session
.createQuery("from TsMoniSession session where 1=1");
return query.list();
}
});
项目中的代码大量的充斥着这种写法,每一个操作都是通过callback去调用hibernate的方法,这个callback到底是个什么原理,但是明明template明明也提供了更为简单的find方法,为什么不去用呢?先去理解理解callback吧。
如果是一个初学者,在碰到下面一个问题的情况下会采取什么样的解决方法。
问题:boss要他计算一下程序中的10个方法的计算时间成本,记录到日志中去。
方案1:这还不简单,每个方法前面加上开始时间,结尾加上结束时间,然后取差就
可以了。代码如下:
long before=System.currentTimeMillis();
method1();
long after=System.currentTimeMillis();
log.info("the cost is:"+(after-before));
非常对,这个解决办法很好的达到目的。但是问题出来了,如果是有1000个这样的方法,工作量就很大了。而且即使十个方法而言,代码本身就有大量重复的代码,这就意味着有可以改进的地方。想象一下:我们(开发者)在使用method的时候都是直接去调用,如果在这个中间可以加一层,然后这个层是对方法可以包装的话,是不是就可以减少那么多重复的代码量呢。我们暂时把它叫做TemplateMethod吧. 那怎么设计呢?难不成我们调用method的时候把方法名作为参数传进去。
方案二:
public void doMethod(String methodName, Object[] parameters)
{
long before = System.currentTimeMillis();
利用java反射执行method
long after = System.currentTimeMillis();
log.info("the cost is:"+(after-before));
}
虽然很好的解决了代码量重复的问题,但是怎么看怎么别扭,因为他完全改变了使用者原先调用方法的习惯,为了计算成本不得不换成后来的调用方式,实在是一种不太优雅的设计。
接口,接口,设计模式这些都是设计优雅的程序的基本,来看看一个即不改变原先调用习惯,又能节省代码的设计。
CallBack.java
public interface CallBack
{
public void doInMyMethod();
}
TemplateMethod.java
public class TemplateMethod
{
public void computeCost(CallBack callback)
{
long before = System.currentTimeMillis();
callback.doInMyMethod("");
long after = System.currentTimeMillis();
log.info("the cost is:" + (after - before));
}
}
再看看我们都怎么使用templateMethod去调用我们的方法
如此的调用方式基本上已经达到了目的了,是不是很熟悉,和本文开头的hibernate的回调很像,没错,spring的设计正是想让使用者还是能像以前使用session操作一样去操作hibernate,不同的是hibernate template已经帮我们做好一些其他的事情了,比如session的获取,session的flush等等。不仅仅是hibernate,ibatis都是有这样的template。到这里我们总算清楚了callback的一点内幕了,再看看为什么使用者为什么用这种方式而不用template的find方法,根据我的理解
- 习惯问题,习惯了seesion的使用方式
- 如果一个业务操作既要查询,又要修改,删除的,如果用template的方法的话,效率显然要低点(如果看看hibernateTemplate的源代码的话,template的方法也是通过回调调用hibernate的方法,只不过包装的更好了),所以干脆就用回调使用hibernate了
回到那个计算时间成本的例子,当然最好的方法是通过spring的aop了,这就是框架的方便之处。
分享到:
相关推荐
标题中的“一段Spring代码引起的调用绑定总结”指的是在使用Spring框架进行开发时,由于代码编写或配置不当,可能会遇到一些调用绑定的问题。这些问题通常涉及到依赖注入、AOP(面向切面编程)以及方法调用的上下文...
标题中的“让IE假死掉的一段代码-有思路和原理”揭示了本文将探讨一个特定的编程片段,这段代码能够在Internet Explorer(IE)浏览器上引发性能问题,导致浏览器无响应,也就是我们常说的“假死”状态。这种现象通常...
在标题"matlab不运行一段代码-VO:VO"中,"VO:VO"可能是指一个特定的变量名或者是一个项目的标识,但在提供的信息中没有足够的细节来明确这一点。描述中的"matlab 不运行一段代码"是一个常见的问题,我们需要分析可能...
Delphi是一款强大的面向对象的 Pascal 编程环境,由Embarcadero Technologies开发。它以其高效、快速的编译器和直观的IDE(集成开发环境)而受到许多开发者喜爱。在编写Delphi代码时,代码的对齐和格式化对于提高...
这个魔术引起了观众们的极大兴趣,而实际上,这并非纯靠魔术师的手法,而是借助了编程技术来实现。本示例将通过JavaScript语言,揭示这场魔术背后的秘密。 首先,我们需要了解这个魔术的基本原理。马云手中的纸牌...
我们可以先想像没有统一风格的情况下,A完成开发以后,B进行维护加一段代码,过一段时间C又加一段代码。。。。。。直到有一天X看到那一大堆乱码想死的心都有了,维护也就进行不下去了。因此,统一的风格有利于长期的...
MATLAB代码,用笔记本摄像头输入的一段人脸视频进行自动心率估计,主要原理是人类血液对与各种频率的光照都有一定的吸收作用,而心跳会引起皮下的毛细血管血液流量变化,从而使皮肤的颜色在心跳的作用下进行周期性的...
### Java程序调试与错误收集——代码引起的报错 在Java开发过程中,经常会出现各种各样的错误,这些错误可能来源于语法、逻辑或者配置等方面。对于初级程序员来说,掌握基本的调试技巧和错误处理方法是非常重要的。...
通常,内存泄漏可能由以下几种情况引起: 1. 单例模式:如果单例对象持有对Activity或其他生命周期依赖对象的引用,可能导致Activity无法被系统正常回收。 2. 静态变量:静态变量生命周期与应用相同,如果静态变量...
- **提取方法**:将一段重复的代码块抽取为独立的方法。 - **提取类**:当一个类承担过多职责时,将相关职责分离到新的类中。 - **引入参数对象**:合并多个参数为一个对象,减少参数数量,提高可读性。 - **...
使用VB代码格式化工具的过程通常非常简单:开发者只需从VB开发环境中选择需要格式化的代码段,复制并粘贴到工具的用户界面中。接下来,工具会自动根据预设的格式规则对代码进行分析和调整,如规范缩进级别、统一空格...
在“CSS常用代码大全(html+css代码).pdf”中,我们可以看到一系列常用的CSS代码及其用法。 首先,关于文本设置,`font-size`用于定义文本的字号,`font-style`可以设置文本的斜体,如`italic`或`normal`,`font-...
在编程世界中,代码质量是衡量软件工程优劣的关键因素之一。这堂“如何提高代码质量的培训课(2)”旨在深入探讨如何通过有效的方法和技术来提升代码质量,从而构建更加可靠、可维护和高效的软件系统。我们将从源码...
综上所述,“三国辅助源代码”所代表的不仅仅是一段代码,它背后所蕴含的是对游戏技术的探索、对玩家体验的优化以及对三国文化的热爱。这类辅助工具的成功开发和应用,既展示了开发者的智慧和能力,也体现了玩家群体...
这些代码片段是由JavaScript编写,通过在网页中插入一段脚本,动态加载并展示广告。当用户访问网页时,JavaScript代码会与广告服务器进行通信,获取广告内容,并将其呈现在指定位置。 二、上下伸缩广告的特点 1. **...
这个过程需要保证不会引起命名冲突,并且不影响代码的正确执行。 3. **代码合并**:将多个JavaScript文件合并成一个文件,减少HTTP请求,进一步提升加载速度。 4. **死代码删除**:分析代码,移除未被使用的变量和...
3. **循环与自启动机制**:如果代码能在重启后仍然生效,那么它可能包含了一个启动脚本,使得计算机在开机时自动执行这段代码,实现持续的蓝屏效果。 4. **安全与伦理**:尽管这样的代码可能用于娱乐,但在未获得...
1. 在用户发布或更新文章时,插件会自动检测到文章中的代码段。 2. 对检测到的代码段,插件会将其中的特殊字符,如尖括号、引号等,替换为对应的HTML实体。 3. 这样,浏览器在渲染页面时,会将这些HTML实体原样输出...