Openfire的web服务器使用的是jetty,jetty启动的类是AdminConsolePlugin,至于该类是何时调用的就不再赘述。
Openfire整合spring MVC的关键点在于你是在何时初始化DispatcherServlet。如果你要把spring mvc整合在openfire项目中那么直接配在openfire的web.xml就行了,但是如果你是想把它配置在一个插件中,那么下面的配置过程可能就会对你有那么一点帮助。所需要用的jar包在网上去下载。
1)创建openfire插件项目,网上有大把的例子。
2)配置web-custom.xml,注意contextConfigLocation的路径地址,根据你自己路径更改。
3)spring-actions.xml配置,需要扫描的包路径根据你自己的路径更改。
4)Action类,spring mvc的action注解类怎么写就不啰嗦了,这里需要注意的一点就是,@RequestMapping(value=”/eraplugins/”)这里一定要加上你的插件名路径,不然spring mvc找不到这个mapping。
5)到此插件这块就差不多配置好了,然后build出来先放一边,接下来修改openfire这边的一些东西。
6)找到PluginServlet类的registerServlets方法,添加参数PluginClassLoader pluginLoader,添加之后PluginManager类会报错,在报错的地方把pluginLoader丢进去。
7)回到PluginServlet类的registerServlets方法,找到Object instance=servletClass.nerInstance()这一步。
添加这么一段代码
此处的主要目的是,openfire注册插件时本身没有对<init-param>做解析,这里自己添加,当然只针对DispatcherServlet。
8)做完上面的步骤之后再向下走一行,找到if(instance instanceof GenericServlet) { 这一步。按照图中的代码添加一段代码。
到此openfire插件+spring mvc的配置也就完成了,至于如何整合hibernate和spring容器暂时只有个头绪,还没有去验证过。
Spring mvc的配置主要就是一个DispatcherServlet类,该类会扫描加载所有Controller,其他的service和entity等等则是由ContextLoaderListene操作的,所以如果想把hibernate或者spring容器等等配置进插件,大概就要在ContextLoaderListene上面做文章了。
再提点openfire上面的东西,openfire涉及到很多的动态加载,比如plugin,所以从个人感觉上面来说openfire中有很多不同的classLoader,加载启动openfire服务器的是Thread.currentThread().getContextClassLoader();这个ClassLoader在serverStarter中已经变成JiveClassLoader (openfier自定义的一个),
这个ClassLoader暂且我们就当做一条主线的ClassLoader,然后plugin的ClassLoader是pluginLoader = new PluginClassLoader();加载jetty的时候new 一个,加载你写的插件再new一个。而初始化DispatcherServlet的时候加载配置文件的ClassLoader获取的是Thread.currentThread().getContextClassLoader();所以这里就可以看出上面改pluginServlet起到的作用了。至于具体的过程就不再啰嗦了,可以去看看openfired的PluginManager和PluginServlet 这两个类,另外再去跟一跟DispatcherServlet的源代码。