您的位置:首页 > 编程语言 > Java开发

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

2017-08-09 12:50 597 查看
-- HibernateTemplate提供的便利

-- 一般我们使用Session的时候,如果这个Session是通过SessoionFactory的openSession方法而来,那么我们需要通过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管理





-- 将HibernateTemplate实例注入程序





-- 调用HibernateTemplate执行Session方法





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


           -- 从HibernateTemplate的save开始





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





-- doExecute方法

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

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

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

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

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

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

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

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

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





-- 关于为什么匿名内部类使用方法的局部变量时,该变量需要声明为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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: