public static <T> T of(Class<T> clazz) {
T instance = (T) dataTableMap.get(clazz);
if (null != instance) {
return instance;
}
dataTableMap.put(clazz, bean(clazz));
return (T) dataTableMap.get(clazz);
}
可以注意到,其中的 bean 方法是通过 ApplicationContext 的 getBean 方法实现。而 ApplicationContext 代表的就是 Spring 容器,即存储与装载 Bean 的容器。让 DataTable 最先注册到 Spring 容器中,即可保证 of 方法可用。因为监听 MySQL binlog 构造增量索引需要使用到 of 方法获取到类似于 AdUnitIndex 的索引服务,此时,如果 AdUnitIndex 已经注入,但是 of 方法并没有注入,将会发生错误。所以,让 DataTable 缓存服务先于各个索引服务在 Spring 容器中完成注册。