`
zhaonjtu
  • 浏览: 130676 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

由一段代码引起的

阅读更多

  最先接触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方法,根据我的理解

  1.   习惯问题,习惯了seesion的使用方式
  2.    如果一个业务操作既要查询,又要修改,删除的,如果用template的方法的话,效率显然要低点(如果看看hibernateTemplate的源代码的话,template的方法也是通过回调调用hibernate的方法,只不过包装的更好了),所以干脆就用回调使用hibernate了

回到那个计算时间成本的例子,当然最好的方法是通过spring的aop了,这就是框架的方便之处。

 

 

 

 

 

 

分享到:
评论

相关推荐

    一段Spring代码引起的调用绑定总结

    标题中的“一段Spring代码引起的调用绑定总结”指的是在使用Spring框架进行开发时,由于代码编写或配置不当,可能会遇到一些调用绑定的问题。这些问题通常涉及到依赖注入、AOP(面向切面编程)以及方法调用的上下文...

    让IE假死掉的一段代码-有思路和原理

    标题中的“让IE假死掉的一段代码-有思路和原理”揭示了本文将探讨一个特定的编程片段,这段代码能够在Internet Explorer(IE)浏览器上引发性能问题,导致浏览器无响应,也就是我们常说的“假死”状态。这种现象通常...

    matlab不运行一段代码-VO:VO

    在标题"matlab不运行一段代码-VO:VO"中,"VO:VO"可能是指一个特定的变量名或者是一个项目的标识,但在提供的信息中没有足够的细节来明确这一点。描述中的"matlab 不运行一段代码"是一个常见的问题,我们需要分析可能...

    Delphi代码对齐工具

    Delphi是一款强大的面向对象的 Pascal 编程环境,由Embarcadero Technologies开发。它以其高效、快速的编译器和直观的IDE(集成开发环境)而受到许多开发者喜爱。在编写Delphi代码时,代码的对齐和格式化对于提高...

    用一段代码演示马云双十一晚会上玩的纸牌魔术

    这个魔术引起了观众们的极大兴趣,而实际上,这并非纯靠魔术师的手法,而是借助了编程技术来实现。本示例将通过JavaScript语言,揭示这场魔术背后的秘密。 首先,我们需要了解这个魔术的基本原理。马云手中的纸牌...

    VB 代码格式化工具

    使用这类工具,开发者可以从VB开发环境中复制一段或多段代码,然后粘贴到格式化工具中。工具会自动分析代码结构,根据预设或自定义的格式规则进行调整,如调整缩进、规范空格、排序import语句、处理括号对齐等。格式...

    整人代码,小心使用

    在"整人代码"的场景下,VBScript可能被用来编写一段简短的程序,当用户运行这个脚本时,会触发某些搞笑或令人惊讶的效果。例如,它可能在用户的屏幕上显示一条假的错误消息,或者播放一段出乎意料的声音。 然而,...

    java代码规范

    我们可以先想像没有统一风格的情况下,A完成开发以后,B进行维护加一段代码,过一段时间C又加一段代码。。。。。。直到有一天X看到那一大堆乱码想死的心都有了,维护也就进行不下去了。因此,统一的风格有利于长期的...

    MATLAB代码,用笔记本摄像头输入的一段人脸视频进行自动心率估计,简单可靠,精度高

    MATLAB代码,用笔记本摄像头输入的一段人脸视频进行自动心率估计,主要原理是人类血液对与各种频率的光照都有一定的吸收作用,而心跳会引起皮下的毛细血管血液流量变化,从而使皮肤的颜色在心跳的作用下进行周期性的...

    Java程序调试与错误收集--代码引起的报错

    ### Java程序调试与错误收集——代码引起的报错 在Java开发过程中,经常会出现各种各样的错误,这些错误可能来源于语法、逻辑或者配置等方面。对于初级程序员来说,掌握基本的调试技巧和错误处理方法是非常重要的。...

    leak测试代码

    通常,内存泄漏可能由以下几种情况引起: 1. 单例模式:如果单例对象持有对Activity或其他生命周期依赖对象的引用,可能导致Activity无法被系统正常回收。 2. 静态变量:静态变量生命周期与应用相同,如果静态变量...

    .java代码重构

    - **提取方法**:将一段重复的代码块抽取为独立的方法。 - **提取类**:当一个类承担过多职责时,将相关职责分离到新的类中。 - **引入参数对象**:合并多个参数为一个对象,减少参数数量,提高可读性。 - **...

    css常用代码大全(html+css代码).pdf

    在“CSS常用代码大全(html+css代码).pdf”中,我们可以看到一系列常用的CSS代码及其用法。 首先,关于文本设置,`font-size`用于定义文本的字号,`font-style`可以设置文本的斜体,如`italic`或`normal`,`font-...

    一堂如何提高代码质量的培训课(2)

    在编程世界中,代码质量是衡量软件工程优劣的关键因素之一。这堂“如何提高代码质量的培训课(2)”旨在深入探讨如何通过有效的方法和技术来提升代码质量,从而构建更加可靠、可维护和高效的软件系统。我们将从源码...

    上下伸缩的JS广告代码

    这些代码片段是由JavaScript编写,通过在网页中插入一段脚本,动态加载并展示广告。当用户访问网页时,JavaScript代码会与广告服务器进行通信,获取广告内容,并将其呈现在指定位置。 二、上下伸缩广告的特点 1. **...

    javascript实用代码压缩工具

    这个过程需要保证不会引起命名冲突,并且不影响代码的正确执行。 3. **代码合并**:将多个JavaScript文件合并成一个文件,减少HTTP请求,进一步提升加载速度。 4. **死代码删除**:分析代码,移除未被使用的变量和...

    可以拿来整人的蓝屏代码

    3. **循环与自启动机制**:如果代码能在重启后仍然生效,那么它可能包含了一个启动脚本,使得计算机在开机时自动执行这段代码,实现持续的蓝屏效果。 4. **安全与伦理**:尽管这样的代码可能用于娱乐,但在未获得...

    文章代码转HTML实体插件forTypecho

    1. 在用户发布或更新文章时,插件会自动检测到文章中的代码段。 2. 对检测到的代码段,插件会将其中的特殊字符,如尖括号、引号等,替换为对应的HTML实体。 3. 这样,浏览器在渲染页面时,会将这些HTML实体原样输出...

Global site tag (gtag.js) - Google Analytics