插件开发中与spring集成遇到的问题

场景
    1.我把spring的所有jar包到放到一个插件中比如叫third-spring插件。
    2.MyTest插件依赖third-spring插件。application.xml配置文件我放在MyTest插件的classPath里。
    第一步基于模块化编程中的可重用性思想,将其作为公共插件。
    这个时候如果在MyTest中使用

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("res/applicationContext.xml");
这个时候会报file not found。文件找不到

原因分析:
我们都知道插件开发一个很重要的一点就是每个插件都有自己的classLoader,这也是模块化编程思想
的一个明显的标志。
造成这个问题,就是因为你拿着别人的classLoader去加载自己的资源。人家看不到你。所以告诉你找不到。表面上你以为现在运行的是你的代码,可当时线程中使用的却不一定是你的classLoader。
解决方案:ClassPathXmlApplicationContext applicationContext ;
final ClassLoader cl = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
} finally {
Thread.currentThread().setContextClassLoader(cl);
}
在加载资源的地方先把线程上下文中的classLoader切换成自己的。最后再替换回来。
在实际应用中可能遇到的比这还复杂。但是决大多数,是因为classLoader问题引起的

猜你喜欢

转载自wangchuanyin.iteye.com/blog/2150808