openfire学习总结之插件

1、 类加载器java

    要深刻理解openfire插件机制的内部原理,必需要深刻了解一下java的类加载器。类加载器做用是加载 Java 类到 Java 虚拟机中。
    加载过程以下:Java 源程序编译后转换成 Java 字节码(.class),类加载器负责读取 字节码,并转换成java.lang.Class类的一个实例。web

   系统提供的类加载器有:bootstrap

    1、引导类加载器(bootstrap class loader)tomcat

      jvm内置的加载器,是用C++实现的。
      引导类加载器的加载路径,由系统属性sun.boot.class.path来指定,它的默认值指向jre的classes目录,及lib目录下rt.jar等几个jar文件。
      可经过-Dsun.boot.class.path来手工指定,也可经过-Xbootclasspath等属性来指定。app

    2、扩展类加载器(extensions class loader)jvm

      类加载路径由java.ext.dirs来肯定,java.ext.dirs属性值指向一个或多个目录,默认jre/lib/ext,加载 Java 的扩展库$java_home/jre/ext/*.jar。函数

    3、应用类加载器(application class loader)spa

              主要负责加载java –classpath、-Djava.class.path或$CLASSPATH环境变量所指的目录下的类与jar包。 通常来讲,Java 应用的类及其依赖jar包也都是由它来完成加载的。能够经过 ClassLoader.getSystemClassLoader()来获取它。插件

   Openfire中自定义的类加载器:线程

    1、JiveClassLoader:类加载路径为openfireHome/lib下的全部jar,zip文件,加载openfire所依赖的核心类库。

    2、PluginClassLoader:openfire插件加载的时候,会为每一个插件建立一个PluginClassLoader对 象,它加载路径为插件目录下的classes,database,i18n,web目录,与lib目录下全部的jar,zip文件,但排除plugin- pluginName.jar文件

2、 内部原理

        1、openfire插件相似于web容器下的多个独立的web应用,openfire就是容器,负责管理插件的生命周期。

  2、openfire经过定时的扫描openfire/plugins目录下的.jar、.war文件及同名的目录,跟踪他们的变化,来决定加 载仍是卸载一个插件。这跟tomcat很相似,主要的差别在与openfire的PluginClassLoader没有tomcat的 WebAppClassLoader那样的优先覆盖机制,openfire严格的遵循了java.lang.ClassLoader类的委托机制。

  3、因为ClassLoader的委托模型,由JiveClassLoader加载的核心类,没法经过委托PluginClassLoader 来隐式加载到插件类,即openfire/lib下的核心类不能依赖于插件中的类,而插件类却能够经过委托JiveClassLoader来加载核心类, 插件类可使用核心类,这个开发中须要注意,避免产生依赖错乱。

3、 生命周期

    1、加载

    加载一个插件时,先解压.jar/.war文件,读取插件目录下的plugin.xml,获得Plugin接口的一个实现类 XXXPlugin,经过建立一个新的PluginLoader对象来加载XXXPlugin,调用默认的无参数构造函数建立一个XXXPlugin对象

    2、初始化

      经过执行initializePlugin,让插件初始化

    3、使用

      初始化后插件即开始工做,处理商业逻辑

    4、销毁

      卸载一个插件时,首先调用这个XXXPlugin对象的destroyPlugin方法,并从PluginManager中删 除这个XXXPlugin对象,而后经过去除PluginClassLoader的引用,让插件中的全部类等待垃圾回收,并删除这个插件目录。 destroyPlugin方法,应该终止它所开启的线程,应该删除全部由上层类加载器对PluginClassLoader加载的类实例的引用,保证插 件的被垃圾回收

相关文章
相关标签/搜索