在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的类加载了

个人见解,如有错误,望不吝赐教,欢迎探讨