这几天旧项目运维时发现曾经写的hibernate监听器很有意思,混合利用了工厂模式和观察者模式。所以特意记录一下
hibernate4的监听器注册方式不同于hibernate3在cfg.xml内进行注册的方式,而是新增了一个监听器注册类:org.hibernate.event.service.spi.EventListenerRegistry,注册方式为:
1 |
|
关于@PostConstruct,我们可以看下这个注解的官方解释:
1
2
3
4
5@Target(value={METHOD})
@Retention(value=RUNTIME)
@Documented
The PostConstruct annotation is used on a method that needs to be executed after dependency injection is done to perform any initialization. This method MUST be invoked before the class is put into service. This annotation MUST be supported on all classes that support dependency injection. The method annotated with PostConstruct MUST be invoked even if the class does not request any resources to be injected.这个注解是用来修饰方法,在jvm运行时保持有效的一个注解。该注解被用于bean初始化完和依赖注入完毕后、被其他bean使用之前必须被执行的方法,就算这个bean不被其他bean依赖,也会执行此方法。简单来说就是:这个注解修饰的方法会在bean内其他依赖注入完毕后执行。私以为类似于jquery的:
1
2
3$(function() {
init();
});
接下来看看hibernate SessionFactory的核心:SessionFactory的实现类org.hibernate.internal.SessionFactoryImpl:
看这段代码前,我们先把关注点放到ServiceRegistry
ServiceRegistry 是 Service 的注册表, 它为Service提供了一个统一的加载 / 初始化 / 存放 / 获取机制.
把SessionFactoryImpl的构造器贴出来:
1 | public SessionFactoryImpl( |
我们重点看这段代码:
1 | this.serviceRegistry = serviceRegistry.getService( SessionFactoryServiceRegistryFactory.class ).buildServiceRegistry( |
然后我们在上处获取了刚刚SessionFactory的EventListenerRegistry并将自己新建的监听类append进去,也就是append入:org.hibernate.event.service.internal.EventListenerRegistryImpl.registeredEventListenersMap内的某一个key.listeners内
众所周知,hibernate简单更新操作如下:
1 | session = HibernateUtils.getSession(); |

我们就以session.save(student)为例子来看看监听器如何运行:
1 | //调用栈如下: |
总结下重要的类:
hibernate SessionFactory—-提供总服务注册表
org.hibernate.SessionFactory:接口:session工厂
org.hibernate.internal.SessionFactoryImpl:实现:session工厂
总服务注册表serviceRegistry—为子服务注册提供注册到总session注册服务表上
org.hibernate.internal.SessionFactoryImpl.serviceRegistry:接口:核心工厂内的服务注册表内部包含了N多种类的服务注册集合
org.hibernate.service.internal.SessionFactoryServiceRegistryImpl:服务注册表实现类
org.hibernate.service.internal.AbstractServiceRegistryImpl.serviceBindingMap:注册表内注册绑定的的map集合
org.hibernate.service.internal.StandardSessionFactoryServiceInitiators:hibernate启动默认的service注册类集合
子服务注册接口定义
org.hibernate.service.spi.SessionFactoryServiceInitiator:接口:子服务注册接口统一定义类
子服务注册:监听器注册类—为指定的监听服务提供注册
org.hibernate.event.service.internal.EventListenerServiceInitiator:监听器service注册类构建类
org.hibernate.event.service.spi.EventListenerRegistry:接口:监听器service注册服务类
org.hibernate.event.service.internal.EventListenerRegistryImpl:实现:监听器service注册服务类
org.hibernate.event.service.internal.EventListenerRegistryImpl.registeredEventListenersMap:监听器service注册提供实现类中的存放监听器种类-监听器实现类的集合对应关系的变量
org.hibernate.event.service.internal.EventListenerGroupImpl
:registeredEventListenersMap的value对象:监听器实现类的集合,包含了我们操作最终影响、后续业务调用的list:org.hibernate.event.service.internal.EventListenerGroupImpl.listeners 监听器—最终注册进EventListenerRegistry
org.hibernate.event.spi.EventType
:规定了监听器种类和对应的监听器interface org.hibernate.event.spi.SaveOrUpdateEventListener:update的监听器接口。监听器需继承这个接口