在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中,有以下代码

//获取当前的ClassLoader
ClassLoader parent = Thread.currentThread().getContextClassLoader();
......
//组件新的ClassLoader
cl = new CachedClassLoader(new URL[0], parent);
........
//设置新的ClassLoader
Thread.currentThread().setContextClassLoader(cl);

OK,这样就将由CachedClassLoader来管理ofbiz的类加载了


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