import org.hibernate.Session; public class MyHibernateTemplate { public void executeWithNativeSession(MyHibernateCallback callback) { Session s = null; try { s = getSession(); s.beginTransaction(); callback.doInHibernate(s); s.getTransaction().commit(); } catch (Exception e) { s.getTransaction().rollback(); } finally { //... } } private Session getSession() { // TODO Auto-generated method stub return null; } public void save(final Object o) { new MyHibernateTemplate().executeWithNativeSession(new MyHibernateCallback() { public void doInHibernate(Session s) { s.save(o); } }); } }
回调接口
import org.hibernate.Session; public interface MyHibernateCallback { public void doInHibernate(Session s); }
以上为模拟spring封装下的HibernateTemplate模板,当为hibernateTemplate注入sessionFactory时,调用hibernateTemplate.save(0),即可完成hibernate事务存储。
在C或者C++中回调函数的定义: 程序在调用一个函数时,将自己的函数的地址作为参数传递给程序调用的函数时(那么这个自己的函数称回调函数)
Java中没有指针,不能传递方法的地址,一般采用接口回调实现:把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。
实现回调的原理简介如下: 首先创建一个回调对象,然后再创建一个控制器对象,将回调对象需要被调用的方法告诉控制器对象。控制器对象负责检查某个场景是否出现或某个条件是否满足。当此场景出现或此条件满足时,自动调用回调对象的方法。
以上的模拟中 MyHIbernateCallback为回调函数。
另一个回调的例子:
回调接口:
package com.denghu; public interface Callback { void execute(); }
测试方法:
package com.denghu; public class TestObject { public static void testMethod(){ for(int i = 0; i < 100000000; i++){ } } }
控制器对象:
package com.denghu; public class Tool { private void testTime(Callback callback) { // TODO Auto-generated method stub long begin = System.currentTimeMillis(); callback.execute(); long end = System.currentTimeMillis(); System.out.println("use time:"+(end-begin)); } public static void main(String[] args) { Tool tool = new Tool(); tool.testTime( new Callback(){ @Override public void execute(){ TestObject.testMethod(); } } ); } }