Spring DM

  • 介绍
这里的DM的意思就是“动态模型”。 SpringDM的核心包有:core、extender、io。 SpringDM中负责注册服务的类是:org.springframework.osgi.service.exporter.support.OsgiServiceFactoryBean。 SpringDM的API文档:http://docs.spring.io/osgi/docs/1.2.1/api/
  • 发布服务
<beans:bean id="beanToPublish" class="com.xyz.imp.MessageServiceImp"/> <service ref="beanToPublish" interface="com.xyz.MessageService"/>
  • 引用服务
<reference id="beanToPublish" interface="com.xyz.MessageService"/> <bean id="referenceBean" class="com.nci.ReferenceBean"> <property name="messageService" ref="beanToPublish"/> </bean>   MandatoryImporterDependencyFactory?
  • 监听器
SpringDM可以监听两种事件:导出、引用服务事件。 实现监听器有两种方式:
  1. 实现OsgiServiceRegistrationListener;
  2. 在service标签中定义服务监听配置;
推荐使用第二种方式,因为,它可以使用POJO的类来做监听器。 Spring DM提供了一个registration-listener元素作为service元素的子元素。 可用的属性如下: ref:指定作为监听器的类的唯一标示符 registration-method:指定当有注册事件产生时将要回调的方法。这个方法必须要有两个参数:服务接口类型、Map或者Dictionary类型 unregistration-method:指定当有注销事件产生时将要回调的方法。这个方法的规定和registration-method一样 监听器的实现可以在spring的配置文件中配置为bean,然后使用元素registration-listener注册。
  • Spring.Dynamic.Modules.in.Action的翻译
6.OSGi and Spring DM for enterprise applications 在这个篇章中,我们将会指导如何使用OSGi。我们将会通过展示如何仍然使用之前使用的第三方库和框架在OSGi环境中:其中的一些已经是OSGi的bundle格式,并且后面会学习如何让其他格式的转变为兼容OSGi的。因为OSGi带给模块性的设计风格在Java开发,后面会展示如何在Spring DM的支持下OSGi环境中的设计。 Spring DM将会是应用程序和OSGi运行时环境中的桥梁,我们将会在6.3章节中讨论这一点,并提供使用OSGi在程序设计中的指导。Spring DM能够帮助你根据那些原则来实现。你将会学习到Spring DM能够嵌入到程序中,并且使OSGi中的bundle之间很容易地相互通信,另外也可以帮助你做到在OSGi中的面向切面编程。 6.1构建一个企业应用的OSGi仓库 在OSGi的开发中,最基本的单元是一个标准的JAR文件格式的bundle,包含增强的元数据信息(metadata)——bundle之间的依赖关系。所有的库文件、框架、模块应用程序都打包在bundle中。 在6.1.1和6.1.2篇中,我们将会看到如何使用这种类型的Java框架和库文件,在6.1.3篇中我们将会看到如何轻松地从OSGi仓库中获取bundle。记住,现在我们说的内容不是特定于Spring DM的,而是对于任何合法的基于OSGi的程序都适用。 6.1.1 Using Java and Java EE frameworks in OSGi environments 在OSGi环境中使用Java框架 作为一个企业应用的开发者,你将永远不会随随便便开始一个新的项目。在开发OSGi应用程序是,你将会看到不是所有的Java库文件或者框架都是打包成OSGi格式的。甚至在使用和执行的过程中不方便使用OSGi的方式。 幸运地是现在已经有些项目开始对日益流行的OSGi做兼容,在打包时会考虑打包成bundle的格式。不要因为害怕而放弃OSGi。有很多企业级应用和库文件可以在OSGi环境中运行。如果你决定开发OSGi应用程序,最大的改变不是框架而是你的应用程序。 6.1.2 Choosing the right frameworks for OSGi 为OSGi选择合适的框架 如果你是一个经验丰富的企业应用的开发者,并且你想要尝试OSGi。不管是哪种情况,你都需要将以前的开发方式和OSGi的方式兼容起来。例如,Jakarta Commons Logging(JCL)因为它的动态发现过程而是对OSGi不兼容。有些功能是对OSGi比较敏感的,例如动态类加载(反射),因此你应该确认你使用的库文件和框架在合适地方时下处理这些文件。 关于Jakarta Commons Logging and OSGi JCL可能是最流行的日志门面,但是很难做到OSGi兼容的。 JCL是对几种日志系统的包装,Log4j其中最流行的。这意味着你可以在你的应用中很轻松地嵌入JCL的API。 JCL将会在第一次调用的时候初始化。初始化包括在类路径中动态地发现可用的实现,然后选择一个,并重定向到对应的调用。按照这个理论,将JCL和Log4j的JAR文件放到你的应用就可以了。如果不走运的话,你将不会看到任何日志消息,然后也很难查找原因。 JCL的发现过程是使用TCCL来动态发现。JCL的实现类也是通过TCCL来定位的,但是JCL是通过当前的类加载器来初始化的。这个动态发现的过程在有的servlet容器中可能是有问题的,所以在OSGi环境中使用是很困难的。 你现在一定在怀疑Spring DM和Spring Framework如何一起使用。使用Spring DM时我们可能也在部署SLF4J的bundles。SLF4J是另一个日志系统的门面。使用SLF4J要比使用JCL简单。不像JCL,SLF4J的发现过程是静态的。 到最后,我们还是要在Spring和Spring DM中使用Jakarta Commons Logging。因此,我们要开发出来一个特殊的JCL的bundle,是通过SLF4J来支持的。它能提供通过SLF4J支持的和JCL一样的API。 6.2 OSGI-Ifying Libraries and frameworks 6.2.1 How to create OSGi-ified versions of Libraries 对于已经存在库文件要做成OSGI兼容格式的文件是显而易见的。 IMPORTING PACKAGES 让我们首先讨论导入的过程,一个库文件中需要使用另外一个库文件中的类文件(我们假定另一个库文件会导出那些类,使得对于其他的bundle是可见的)。我们看一个例子,考虑在Spring Framework中的ORM模块——这个模块包括了对几种流行的对象关系型数据库的操作(ORM)工具,例如:Hibernate、IBATIS和OpenJPA。现在我们只看Hibernate这个框架,这个模块的Import-Package可能看起来如下: Import-Package : org.hibernate,org.hibernate.cache,org.hibernate.cfg (...) Hibernate有很多包结构,Spring ORM会用到其中的很多,但是,我们不需要把全部的都引用。 之前的片段对于Spring ORM是能够看到Hibernate的包结构,但是关于版本的使用确实很不清晰。在2.5.6.A版本中Spring ORM's Hibernate仅仅支持3.2版本的Hibernate,这个版本支持的信息应该在manifest中有所体现。Import-Package这个头信息能够通过version这个属性来指定锁需要的bundle的确切的版本或者一个范围。这个属性默认是在这个范围中[0.0.0, ?),如果不指定version这个属性的话在OSGi容器中是可以使用任何版本的。 就像你看到的,好的OSGi的bundle应该在Import-Package中指定版本号。Spring ORM申明了从3.2.6.ga版本开始支持Hibernate,但是不包括4.0.0: Import-Package: org.hibernate;version="3.2.6.ga,4.0.0)",org.hibernate.cache;version="3.2.6.ga,4.0.0)",org.hibernate.cfg;version="[3.2.6.ga,4.0.0)" 备注:ga这个版本限定符是“General Availability”的缩写,是产品预发布的意思。 Spring ORM不仅仅支持Hibernate,还支持iBATIS,以及其他的。所以同样地在iBATIS中也可以申明版本号: com.ibatis.common.util;version="[2.3.0.677,3.0.0)" 但是,在实际开发中你就会发现你除了要搞定Spring ORM对Hibernate的依赖问题,还需要解决其他所有的依赖的版本问题。这确实是件很痛苦的事情。  
  • 参考
http://www.blogjava.net/chaocai/archive/2008/12/22/247792.html http://docs.spring.io/osgi/docs/1.1.0-m1/api/org/springframework/osgi/web/extender/deployer/tomcat/TomcatWarDeployer.html http://www.blogjava.net/benniaolk/articles/316756.html 介绍如何使用注解http://www.open-open.com/lib/view/open1325412651828.html

你可能感兴趣的:(java,spring,osgi,dm)