从Spring HibernateTemplate模板方法设计模式的实现谈起

 HibernateTemplate提供的便利(www.50xiao.com)

-- 一般我们使用Session的时候,如果这个Session是通过SessoionFactoryopenSession方法而来,那么我们需要通过Try-Catch-Finally代码块来讲Session以及Transaction操作包裹。这么做的目的主要有两方面:

1. 出现异常时及时回滚Transaction

2. 无论出现异常与否都可以在Finally代码块里关闭Session。这种情况就如同使用JDBC通过Connection连接数据库的操作。

-- 但是在Hibernate中,Session有关数据库操作的方法很多,如果在每次使用这些Session方法时都写一遍Try-Catch-Finally代码块,我们的代码就会变得很不优雅。不符合面向对象复用的原则。

-- 使用HibernateTemplate(实际上Spring对包括JDBC在内的大部分持久化技术都做了Template的支持),也就是模板方法设计模式,就可以免去重复这些代码块的工作。而只需要集中于Session的方法调用就可以了。

       -- HibernateTemplate的使用

           -- HibernateTemplate交给Spring管理

从Spring <wbr>HibernateTemplate模板方法设计模式的实现谈起

-- HibernateTemplate实例注入程序

从Spring <wbr>HibernateTemplate模板方法设计模式的实现谈起

-- 调用HibernateTemplate执行Session方法

从Spring <wbr>HibernateTemplate模板方法设计模式的实现谈起

        -- HibernateTemplate实现模板方法设计模式的原理

           -- HibernateTemplatesave开始

从Spring <wbr>HibernateTemplate模板方法设计模式的实现谈起

-- 按照执行步骤查看executeWithNativeSession方法

从Spring <wbr>HibernateTemplate模板方法设计模式的实现谈起

-- doExecute方法

    -- 下图中用黄色底色条标出的就是我们的匿名内部类对象。

    -- doExecute方法回调了该对象的doInHibernate方法

    -- 这里解释一下回调函数

-- 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

-- 但是在Java中并没有指针这种东西,所以使用了通过匿名内部类传递回调函数的办法。

-- 为什么要使用回调函数

因为可以把调用者与被调用者分开,所以调用者不关心谁是被调用者。它只需知道存在一个具有特定原型和限制条件的被调用函数。简而言之,回调函数就是允许用户把需要调用的方法的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。

                  -- Java中使用回调函数的例子

Javalistener模型中,一个事件发生,那么系统就会调用通过匿名内部类实现的handler,来做出响应。

从Spring <wbr>HibernateTemplate模板方法设计模式的实现谈起

50校招生网 http://www.50xiao.com

-- 关于为什么匿名内部类使用方法的局部变量时,该变量需要声明为final的解释

-- 其实解释总结起来就是局部变量的生命周期太短,没有匿名内部类对象的生存周期长。所以必须将局部变量声明为final。从而该变量就不会被放在JVM存储区域的栈中,而会被放在方法区中,从而延长了生命周期,

-- The difference is between local (method) variables vs class member variables. A member variable exists during the lifetime of the enclosing object, so it can be referenced by the inner class instance. A local variable, however, exists only during the method invocation, and is handled differently by the compiler, in that an implicit copy of it is generated as the member of the inner class. Without declaring the local variable final, one could change it, leading to subtle errors due to the inner class still referring to the original value of that variable.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值