bernate的实现(2)
时间:2011-03-29 javaeye jiwenke
而直接调用org.hibernate.cfg.Configuration来得到需要的SessionFactory:
Java代码
protected SessionFactory newSessionFactory(Configuration config) throws HibernateException {
return config.buildSessionFactory();
}
所以我们这里看到LocalSessionFactory大致起到的一个读取资源配置然后生成 SessionFactory的作用;当然这里在得到 SessionFactory之后,还需要对session的事务 管理作一些处理 - 使用了一个Proxy模式对getCurrentSession方法进行了拦截;
Java代码
//这里先根据当前的SessionFactory的类型得到Proxy,然后插入Spring定义好 的getCurrentSession拦截器
protected SessionFactory getTransactionAwareSessionFactoryProxy (SessionFactory target) {
Class sfInterface = SessionFactory.class;
if (target instanceof SessionFactoryImplementor) {
sfInterface = SessionFactoryImplementor.class;
}
return (SessionFactory) Proxy.newProxyInstance (sfInterface.getClassLoader(),
new Class[] {sfInterface}, new TransactionAwareInvocationHandler(target));
}
拦截器的实现如下:
Java代码
private static class TransactionAwareInvocationHandler implements InvocationHandler {
private final SessionFactory target;
public TransactionAwareInvocationHandler(SessionFactory target) {
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// Invocation on SessionFactory/SessionFactoryImplementor interface coming in...
// 这里对getCurrentSession方法进行拦截,得到一个和当前事务绑定 的session交给用户
if (method.getName().equals("getCurrentSession")) {
// Handle getCurrentSession method: return transactional Session, if any.
try {
return SessionFactoryUtils.doGetSession ((SessionFactory) proxy, false);
}
catch (IllegalStateException ex) {
throw new HibernateException(ex.getMessage());
}
}
else if (method.getName().equals("equals")) {
// Only consider equal when proxies are identical.
return (proxy == args[0] ? Boolean.TRUE : Boolean.FALSE);
}
else if (method.getName().equals("hashCode")) {
// Use hashCode of SessionFactory proxy.
return new Integer(hashCode());
}
// 这里是需要运行的SessionFactory的目标方法
try {
return method.invoke(this.target, args);
}
catch (InvocationTargetException ex) {
throw ex.getTargetException();
}
}
}
Spring源代码解析(八):Spring驱动Hibernate的实现(3)
时间:2011-03-29 javaeye jiwenke
我们看看getCurrentSession的实现,在SessionFactoryUtils中:
Java代码
private static Session doGetSession(
|