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();
}
}
);
}
}