在ofbiz中有一个自定义的ClassLoader:CachedClassLoader,这个方法有什么用呢?

通过查看源代码我们发现

public static final String module = CachedClassLoader.class.getName();
    public static final ConcurrentHashMap<String, Class<?>> globalClassNameClassMap = new ConcurrentHashMap<String, Class<?>>();
    private static final Set<String> globalBadClassNameSet = new CopyOnWriteArraySet<String>();
    private static final ConcurrentHashMap<String, URL> globalResourceMap = new ConcurrentHashMap<String, URL>();
    private static final Set<String> globalBadResourceNameSet = new CopyOnWriteArraySet<String>();

    private final String contextName;
    private final ConcurrentHashMap<String, Class<?>> localClassNameClassMap = new ConcurrentHashMap<String, Class<?>>();
    private final Set<String> localBadClassNameSet = new CopyOnWriteArraySet<String>();
    private final ConcurrentHashMap<String, URL> localResourceMap = new ConcurrentHashMap<String, URL>();
    private final Set<String> localBadResourceNameSet = new CopyOnWriteArraySet<String>();

这个类其实是存储我们加载到ClassLoader中的类信息的,有什么用呢?

因为在ofbiz中,每一个模块都生成了自己独立的jar文件,这个CachedClassLoader的作用就是如何加载和管理这些jar文件,有点动态部署的意思。

然后我们来看一看这个ClassLoader是如何启动的

在framework\base\ofbiz-component.xml里边有以下配置

<!-- load the cached classloader container (always second) -->
    <container name="classloader-container" loaders="main,rmi,pos,install,test" class="org.ofbiz.base.container.ClassLoaderContainer"/>

注释上已经说的很明白了,第二个启动,第一个启动的是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的类加载了


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