<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grid:15.6pt;} div.Section1 {page:Section1;} -->
项目中用到了 OpenSessionInViewFilter 来将 hibernate 的 session 对象绑定到每个请求线程中,如此,只要在一个请求过程中与 session 发生过关联的对象(也就是持久态对象)不管事务提交没提交,直到请求结束该对象都会一直保持持久态。
知其然更要知其所有然,那么 spring 是如何实现这个绑定,又是如何用它来进行事务管理的呢?
通过查看 spring 源代码可以发现:在 OpenSessionInViewFilter 中有个 doFilterInternal 方法,在这个方法里面有段这样的代码:
Session session = getSession(sessionFactory); TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session));
看到这里不难发现,每个请求被这个 filter 拦截的时候都会有一个 session 被 TransactionSynchronizationManager.bindResource ()方法保存了起来,那么这个 session 被保存到了那里呢?通过查看 bindResource ()这个方法可以发现该 session 对象其实是被 sessionHolder(session) 包装后以 sessionFactory 为 key , sessionholder 为 value 保存到了一个 map 对象中, map 对象又被保存到了 TransactionSynchronizationManager 类的一个 ThreadLocal 类型的属性中,借由将 session 保存到 threadlocal 中实现了将 session 绑定到请求的功能。
在 spring 的 HibernateTransactionManager 中通过调用
SessionHolder sessionHolder = (SessionHolder)TransactionSynchronizationManager.getResource(getSessionFactory()); 方法来获取请求开始的时候保存到请求线程的 session ,从而实现了 session 的生命周期在整个请求过程中都有效的功能
真不敢想象要是Java没了threadLoacl spring该怎么办。。。