在ofbiz中有一个自定义的ClassLoader:CachedClassLoader,这个方法有什么用呢?
通过查看源代码我们发现
public static final String module = CachedClassLoader.class.getName(); public static final ConcurrentHashMap> globalClassNameClassMap = new ConcurrentHashMap >(); private static final Set globalBadClassNameSet = new CopyOnWriteArraySet (); private static final ConcurrentHashMap globalResourceMap = new ConcurrentHashMap (); private static final Set globalBadResourceNameSet = new CopyOnWriteArraySet (); private final String contextName; private final ConcurrentHashMap > localClassNameClassMap = new ConcurrentHashMap >(); private final Set localBadClassNameSet = new CopyOnWriteArraySet (); private final ConcurrentHashMap localResourceMap = new ConcurrentHashMap (); private final Set localBadResourceNameSet = new CopyOnWriteArraySet ();
这个类其实是存储我们加载到ClassLoader中的类信息的,有什么用呢?
因为在ofbiz中,每一个模块都生成了自己独立的jar文件,这个CachedClassLoader的作用就是如何加载和管理这些jar文件,有点动态部署的意思。
然后我们来看一看这个ClassLoader是如何启动的
在framework\base\ofbiz-component.xml里边有以下配置
注释上已经说的很明白了,第二个启动,第一个启动的是component-container组件加载器
在ClassLoaderContainer中,有以下代码
//获取当前的ClassLoaderClassLoader parent = Thread.currentThread().getContextClassLoader();......//组件新的ClassLoadercl = new CachedClassLoader(new URL[0], parent);........//设置新的ClassLoaderThread.currentThread().setContextClassLoader(cl);
OK,这样就将由CachedClassLoader来管理ofbiz的类加载了
个人见解,如有错误,望不吝赐教,欢迎探讨