Spring中 Callback模式和Template模式合用 随处可见。下面以常用的HibernateTemplate为例进行简要简述。
在HibernateTemplate模板类中有一个核心的方法:doExecute,这个核心的方法采用模板方法 完成相关的固定 操作(建立连接,执行操作,释放连接) ,其中的具体步骤通过回调传入的对象(这个对象就是实现了Callback接口的类)来完成。
下面讲一下HibernateTemplate的内部实现原理
在HibernateTemplate模板类中有一个核心的方法:doExecute,这个核心的方法采用模板方法 完成相关的固定 操作(建立连接,执行操作,释放连接) ,其中的具体步骤通过回调传入的对象(这个对象就是实现了Callback接口的类)来完成。
import org.springframework.orm.hibernate3.HibernateTemplate;
@Component("userDaoImpl")
public class UserDaoImpl implements UserDao {
private HibernateTemplate hibernateTemplate;
public HibernateTemplate getHibernateTemplate()
{
return hibernateTemplate;
}
@Resource(name="hibernatTemplate")
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
@Override
public void save(User u) {
hibernateTemplate.save(u);
//这里可以直接save了,session已经被hibernateTemplate处理了。我们不需要关心它了。
//因为HibernateTemplate中已经注入了SessionFactory了,因为它自己会处理好session及其事务的。
System.out.println("user save...");
}}
下面讲一下HibernateTemplate的内部实现原理
//建立HibernateTemplate回调函数
interface HibernateCallback
{
//内部只有doInHibernate方法
public Object doInHibernate(Session session);
}
//建立Session类为实际该类为sessionFactory创建
class Session
{
//这里只列出createQuery方法,实际存在save,update,load等方法
public Object createQuery(String hql)
{
System.out.println(hql);
return "添加成功";
}
}
//HibernateTemplate类
class BackCallTemplate
{
//这里是执行的方法
public Object execute(HibernateCallback backCall)
{
//这个方法的请求处理交给doExceute;
return doExecute(backCall);
}
//它来做请求处理
public Object doExecute(HibernateCallback action)
{
//首先去判断是否已经有一个session对象,如果没有则创建一个,存在就返回Session对象
//Session session = (enforceNewSession ?SessionFactoryUtils.getNewSession(getSessionFactory(), getEntityInterceptor()) : getSession());
Session session = new Session();
//这里执行架设函数
return action.doInHibernate(session);
}
}
public class TempateMain
{
//这里仅仅使用main作测试
public static void main(String[] args)
{
//传递:
//1.得到HibernateTemplate对象
//2.向HibernateTemplate.execute方法中传递HibernateCallback对象
//3.覆写HibernateCallback对象
BackCallTemplate getHibernateTemplate = new BackCallTemplate();
//我们使用的是回调函数,在回调函数里处理行为
//疑问:怎么才能调用getHibernateTempleate.save(X x)呢?
//答:可将Main方法进行封装,通过方法参数传递参数即可!
String str = (String) getHibernateTemplate.execute(new HibernateCallback()
{
public Object doInHibernate(Session session)
{
return session.createQuery("select count(id) from table");
}
});
System.out.println(str);
}
}
参考文档:http://blog.youkuaiyun.com/itpinpai/article/details/8236547