本文章完全模拟HibernateTemplate类重写hibernate的方法时用到的回掉函数和匿名内部类结合的思想,以便了解其中的编程思想。
接口类
该类为一个回掉接口,提供了回掉方法,并规定了参数和返回值,等待客户端实现
package callback;
import org.hibernate.Session;
public interface HibernateCallback {
public Object doInHibernate(Session session);
}
核心类
该类提供了一个doExecute方法,封装了一些相同的操作。该方法的重点是以接口为参数,在该方法中调用接口中的方法,因为接口中的方法没有实现,所以在其他方法调用该方法的时候,直接以new一个匿名内部类实现该回调函数即可,这样新方法中就可以不用重写与doExecute方法中相同的操作。
这个类设计思想的精髓在于:既方便了HibernateTemplate内部对hibernate常用方法的重写,又便于程序员(客户端)调用该方法。
package callback;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
public class SpringHibernateCore {
private SessionFactory sessionFactory;
//提供set方法,将sessionFactory注入到该类中
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public Object doExecute(HibernateCallback action){
Object object=null;
Session session=sessionFactory.openSession();
object=action.doInHibernate(session);
session.close();
return object;
}
public List find(final String hql){
return (List)this.doExecute(new HibernateCallback() {
@Override
public Object doInHibernate(Session session) {
return session.createQuery(hql).list();
}
});
}
}
DAO类
package callback;
import java.util.List;
import domain.Person;
public class PersonDaoCallback extends SpringHibernateCore{
public void queryPerson(){
List<Person> persons = this.find("from Person");
System.out.println(persons.size());
}
}
测试类
package callback;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class PersonCallbackTest {
@Test
public void testPersonCallback(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
PersonDaoCallback personDaoCallback = (PersonDaoCallback) context.getBean("personDaoCallback");
personDaoCallback.queryPerson();
}
}