- 浏览: 3503178 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
wanglf1207:
EJB的确是个不错的产品,只是因为用起来有点门槛,招来太多人吐 ...
weblogic-ejb-jar.xml的元素解析 -
qwfys200:
总结的不错。
Spring Web Flow 2.0 入门 -
u011577913:
u011577913 写道也能给我发一份翻译文档? 邮件437 ...
Hazelcast 参考文档-4 -
u011577913:
也能给我发一份翻译文档?
Hazelcast 参考文档-4 -
songzj001:
DbUnit入门实战
http://code.google.com/p/springosginodm/
OSGI+Spring+Hibernate+...完美解决方案[非SpringDM]
导论 “世间本无事,庸人自扰之” SpringDM就是一庸人!
最近,我做一个项目需要编写 Eclipse的插件。我想在Eclipse插件中使用Spring和Hibernate。但却遇到了巨大的问题。按照Spring组织的提示,我使用SpringDM1.02编写Spring程序(后来用SpringDM1.1,SpringDM又叫 SpringOSGI)。但是总是遇到种种问题。特别是Spring管理下的Hibernate,总是无法找到Hibernate的配置文件。
到了后来,连Eclipse也挂了。每次重设Eclipse的目标插件集合的时候,Eclipse都会死掉!
终于,我再也无法忍受SpringDM的折磨了! 我告诉自己,是时候反思了!
终于,我发现了SpringDM根本就是一个完全、彻底失败,无用的废物! 所有的问题都是SpringDM造成的! 而不是SpringDM所说的,OSGI,Hibernate等等其他软件造成的!
我终于发现了OSGI+Spring+Hibernate+...完美解决方案。 不敢藏私,拿出来给各位共享。
问题的根源—ClassLoader OSGI提供了自己的ClassLoader。每一个OSGI的插件,都有一个独立的ClassLoader被使用。这样就实现了各个插件的独立性。一个JVM上可以运行无数个OSGI插件,每一个OSGI插件都是独立的,除非发布为OSGI服务,或者发布自己Package。 SpringDM的工作原理是这样子的:(我猜想的) 1,SpringDM是一个OSGI插件。作为一个一般的插件进行部署。 2,SpringDM一旦启动,就会探查所有其他Active状态的插件。 1)MANIFEST.MF中没有Spring的头,如果有,执行该配置。 2)如果MANIFEST.MF中没有Spring的头,探查META-INF/spring/目录下有没有.xml文件,如果有,它也是一个 SpringDM项目。
SpringDM探查其他插件的资源,应该使用的是这些插件的BundleContext对象来实现的。
另外,SpringDM应该注册了OSGI的事件,这样,其他插件启动,关闭,都会通知SpringDM。
如果 SpringDM发现一个插件是SpringDM插件。就导入该插件中的Spring配置文件,创建ApplicationContext。然后,把该 ApplicationContext作为OSGI服务发布。 如果插件中需要显式的getBean()方法获得对象,就使用它来获得。
SpringDM的问题 SpringDM的DM----动态管理,这个设计似乎很巧妙! 刚开始我也被SpringDM的这一“强大功能”所折服。 但是,实际上,SpringDM的所有问题根源,就在这里!
SpringDM 实际上是在SpringDM这个插件中为所有Spring插件创建ApplicationContext的!显然,此时使用的ClassLoader是SpringDM这个插件的ClassLoader,而不是实际的Spring项目的插件的 ClassLoader。 并且,当前线程中的ClassLoader,也是SpringDM插件的ClassLoader。 这样,就产生了问题。如,Hibernate,它内部使用当前线程中的ClassLoader来载入配置文件。 Thread.currentThread().getContextClassLoader() 绝大部分现有Java代码都使用这样的代码来获得ClassLoader来载入资源,动态创建类。现在,使用了SpringDM,所有这些代码的ClassLoader都会出现问题!!!都无法找到资源!!!这些日子里,我都快被这样的问题给逼疯了! SpringDM的谎言 SpringDM的官方文档,把这些问题的责任推给了Hibernate和OSGI。它说,由于OSGI环境下ClassLoader的特殊性,因此使用 Thread.currentThread().getContextClassLoader()得到的ClassLoader都是不正确的。应该使用BundleActivator接口的实现类的Classloader来得到正确的ClassLoader。
而Hibernate这样的设计时未考虑OSGI环境的类库,在OSGI环境中出错是不可避免的。 因此,Hibernate应该修改代码,以适应OSGI环境。
而我上了Hibernate网站,没有看到HibernateOSGI项目。
我看到有不少朋友在网上写了一些补丁代码,让Hibernate在SpringDM环境下正确运行。 看来,我们还应该忙着修改数以亿行计的Java代码,把获得ClassLoader的代码修改掉,否则在SpringDM的OSGI环境下就会报错!
悲惨!!!如果真是如此,OSGI真的没有存在的价值了!!!
事实 但是,事实并非如此!!!
如果不使用SpringDM,直接在OSGI插件中使用Hibernate,或者 Thread.currentThread().getContextClassLoader(),都可以正确载入资源。因为,OSGI插件使用的ClassLoader是可以直接载入OSGI插件的所有资源的。并且,当前线程中的ClassLoader,也是当前OSGI 插件使用的ClassLoader。
因此,SpringDM在说谎! SpringDM的动态创建ApplicationContext的机制是一系列问题的源泉。
OSGI+Spring+Hibernate+...完美解决方案[非SpringDM] 只要不使用SpringDM的动态创建ApplicationContext机制,就可以避免上述种种问题。试一下在BundleActivator接口中直接使用new ClassPathXmlApplicationContext()的方式创建ApplicationContext。 结果失败了!
通过Debug,我发现是Spring自己的一些特殊处理方式使它在OSGI环境下失败。
然后,我研究了SpringDM1.1的API,找到了在插件中直接创建ApplicationContext的方法。
评论
使用osgi也是因为它的动态装卸能力。SpringDM的动态创建ApplicationContext的机制也是一种合理的选择啊。
另外,没有理解你要解决的Hibernate的问题是什么。是Mapping的动态装卸?
由于处于发展中SpringDM在实际使用环境中存在不少问题,springosginodm就是征对这些问题重新作了自己的实现,从而解决之。
另外,没有理解你要解决的Hibernate的问题是什么。是Mapping的动态装卸?
发表评论
-
字符串分割--java中String.split()用法
2013-03-06 14:25 74151在java.lang包中有String.sp ... -
用 HttpServletResponseWrapper 实现 Etag 过滤器
2012-07-09 16:58 3759原文出处:http://blog.chenlb.com/200 ... -
Fitnesse使用
2012-05-05 13:27 23494Fitnesse 的使用 一,介绍 Fitnesse是一种 ... -
Customizing the new FitNesse parser
2012-05-05 13:13 2134FitNesse began its life using ... -
java application中内嵌ActiveX控件
2011-11-14 15:57 5524我这里用的是SWT/JFace开发application,SW ... -
Google Java Developer Tools Downloads
2011-08-09 00:04 2347WindowBuilder Pro原来叫WindowB ... -
Jalita
2011-08-06 00:49 1566Jalita (Java light terminal ada ... -
【转】用Java写字符终端界面
2011-07-29 13:13 2122终端界面GUI开源项目charva。 这个框架让你可以用开发 ... -
[转]mybatis下的分页,支持所有的数据库
2011-07-21 13:21 14841大 家都知道,mybatis的自带分页方法只是逻 ... -
Java framework for text- & console-based forms?
2011-07-21 01:06 1711charva jcurses JNA , ... -
JNA(Java Native Access)学习入门
2011-07-21 01:04 22627Java Native Access 项目 在 ... -
JAVA上加密算法的实现用例
2011-06-25 12:38 4884来源:www.ibm.com ... -
如何将GlassFish作为Windows服务运行
2011-05-18 23:21 2375本文档来自GlassFish官方网站,详细介绍了将 G ... -
JAVA UDP打洞必备知识点---NAT
2011-05-05 12:56 8699一、引言 RFCl631 ... -
Keystore概念,Keytool工具使用
2011-04-28 16:20 2906近来由于项目需要做Single Sign On, 研究了一 ... -
利用Eclipse Profile Plugin监控分析Tomcat性能
2011-04-18 16:14 3703目前新版本的Eclipse在启动应用服务器的时候有一个新的选 ... -
m2eclipse: Eclipse is running in a JRE, but a JDK is required
2011-02-04 23:43 2542Eclipse 安装了Maven插件,启动Eclipse ... -
利用JNative实现Java调用动态库
2010-10-18 00:43 2101由于项目要求,需要用J ... -
RHEL5支持大内存
2010-10-08 16:19 3005安装 RHEL 5 ,硬件为 4G 内存,安装完成 ... -
Windows Server 2003 和 Windows 2000 提供大内存支持
2010-10-08 16:19 1854本文介绍物理地址扩展 ...
相关推荐
Spring OSGi是Spring框架与OSGi(Open Service Gateway Initiative)规范相结合的一种技术,它允许在OSGi容器中运行和管理Spring应用。OSGi是一种模块化系统,为Java应用程序提供了动态部署、版本控制和依赖管理的...
在本文中,我们将深入探讨如何在OSGi环境中整合Spring-DM和Hibernate,以实现一个动态的、可扩展的持久化解决方案。Spring-DM(现在被称为Spring OSGi)是Spring框架在OSGi容器中的扩展,它允许我们充分利用OSGi的...
- **Spring DM**(Spring Dynamic Modules)是Spring框架的一个扩展,它结合了OSGi(Open Service Gateway Initiative)的强大功能,旨在帮助开发者在复杂的分布式环境中构建更加灵活、可扩展的应用程序。...
《OSGI实战:结合Spring DM》 OSGI(Open Service Gateway Initiative)是一种模块化系统和服务平台,它允许软件以模块化的方式进行构建、部署和管理。OSGI在Java世界中扮演着重要的角色,因为它提供了动态性、可...
1.1.2 解决方案 1 1.1.3 工作原理 3 1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用构造程序创建Bean 14 1.3.1 问题 14 1.3.2 解决方案 14 1.3.3 ...
1.1.2 解决方案 1 1.1.3 工作原理 3 1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用构造程序创建Bean 14 1.3.1 问题 14 1.3.2 解决方案 14 1.3.3 ...
但是随后,Springsource决定退出他们的工作,并将其Spring DM Server解决方案提交给正在作为Eclipse Virgo运行的eclipse社区。 除此之外,还有很多声音(来自知名专家,但时刻关注着日期)不会鼓励您使用OSGi技术。...
- **与Spring的集成**:Spring Dynamic Modules (Spring DM)是Spring框架与OSGi的桥梁,使得Spring应用可以在OSGi环境中运行。Spring DM允许在OSGi容器中管理Spring应用的bean和服务。 - **与Hibernate的集成**:在...
1. 添加Spring DM支持库。 2. 配置Spring Bean。 3. 注册服务。 #### 十、OSGi与Hibernate框架的整合 OSGi也可以与Hibernate整合,实现持久层的管理和操作。 **步骤**: 1. 创建数据库表结构。 2. 定义Hibernate...
* Building modular services using OSGi with Spring DM and Spring Dynamic Modules and SpringSource dm Server. * Delivering web applications with Spring Web Flow, Spring MVC, Spring Portals, Struts, ...
**Spring Dynamic Modules (Spring DM)**是Spring的一个子项目,它将Spring框架与OSGi框架结合起来,使得Spring应用程序能够在OSGi环境下运行。Spring DM利用了Spring的IoC容器和OSGi的模块化能力,为开发者提供了一...
**Spring-DM**(Spring Dynamic Modules)是SpringSource推出的一个框架,它的目标是简化在OSGi环境中使用Spring的流程。它提供了一种方法来管理和部署Spring应用,使其能适应OSGi服务的生命周期。 **Maven**是一个...
3. SpringSource dm Server:这是一个开源的OSGi服务器,用于部署和管理基于Spring的应用程序。 针对企业集成,本书讲解了如何使用Spring Integration来进行服务集成,并介绍了消息传递模式。还探讨了Spring AMQP...
随着Spring的不断演进到3.0版本,它已经发展成为一个庞大的生态系统,SpringSource在其基础上创建了许多模块,这些模块不仅简化了Java EE的API,还提供了许多Java EE自身未涵盖的垂直解决方案,如应用集成、批处理和...
可以查看博文链接(https://lyndon-lin.iteye.com/blog/856002)获取更详细的解决方案,或者参考Spring DM的官方文档以了解如何在OSGI中管理类加载。 总之,`NoClassDefFoundError`是一个典型的运行时异常,需要对...
7. **CXF Example OSGi Blueprint** 和 **CXF Example OSGi**:这两个示例都是关于在OSGi环境中使用Camel-cxf组件,但分别使用OSGi Blueprint和Spring-DM来管理依赖。 8. **CXF Proxy Example**:演示了如何使用...
- **dmServer**: 为 OSGi 基础设施提供支持的插件。 - **Google App Engine (GAE)**: 支持 Google 的云平台应用程序开发。 - **GWT**: 支持 GWT(Google Web Toolkit)的应用开发,包括代码提示、编译和组件开发等...
- **OSGi**:为Java平台定义了一个动态模块系统,Equinox 和 SpringDM 是其中两个实现。 - **SOA框架**:如Apache Tuscany,用于构建服务导向架构(SOA)应用。 - **P3:特定领域框架** - **Flex/Sliverlight**:...