OSGI企业应用开发(五)使用Blueprint整合Spring框架(二)

来源:互联网 发布:狼道seo 编辑:程序博客网 时间:2024/05/16 10:51

上篇文章中,我们开发了一个自定义的Bundle,接着从网络中下载到spring和Blueprint的Bundle,然后复制到DynamicRuntime项目下。
需要注意的是,这些Bundle并不能在Eclipse自带的Equinox启动管理工具中显示,因为我们并没有將这些Bundle添加到自定义的Target Platform中,接下来我们就来完成这一操作。

一、启动Spring和Blueprint相关Bundle

单击Window=>Preferences菜单,然后单击Plug-in Development=>Target Platform选项,选择我们之前新建的DynamicRuntime,如下图所示:
这里写图片描述
单击Edit按钮,按照前面文章中提到的方式,把spring 和blueprint目录下的Bundle添加到DynamicRuntime中,如下图:
这里写图片描述
然后单击Finish按钮即可完成操作,接下来我们要做的是启动Spring和Blueprint相关的Bundle。

单击Run=>Debug Configurations…菜单,单击OSGI Framework下面我们之前的新建的启动项,如下图:
这里写图片描述
我们需要勾选Spring和Blueprint相关的全部Bundle,然后单击面板上的Validate Bundles按钮,该功能用于校验Bundle是否存在依赖问题,单击后,弹框内容如下:
这里写图片描述
可以发现Spring相关的Bundle都缺少公共的日志包依赖,普通的Java项目对应的common-logging.jar包,我们可以单击Add Required Bundles按钮,让Eclipse工具自动为我们勾选上依赖的Bundle,然后再次单击Validate Bundles按钮,出现如下弹窗说明不存在依赖问题了:
这里写图片描述
这是一个非常好的现象,意味着我们可以重新启动Equinox容器了,单击Debug按钮即可,控制台输出日志内容如下:

Hello World!!十二月 18, 2016 10:32:34 下午 org.eclipse.gemini.blueprint.extender.internal.boot.ChainActivator <init>信息: Blueprint API detected; enabling Blueprint Container functionality十二月 18, 2016 10:32:34 下午 org.eclipse.gemini.blueprint.extender.internal.activator.LoggingActivator start信息: Starting [org.eclipse.gemini.blueprint.extender] bundle v.[2.0.0.M02]osgi> 十二月 18, 2016 10:32:34 下午 org.eclipse.gemini.blueprint.extender.internal.support.ExtenderConfiguration start信息: No custom extender configuration detected; using defaults...十二月 18, 2016 10:32:34 下午 org.springframework.scheduling.timer.TimerTaskExecutor afterPropertiesSet信息: Initializing Timer
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

二、通过XML文件配置Bean

到目前为止,我们已经成功使用Blueprint和Spring整合到OSGI中,但是好像还缺点什么,在普通的Java项目中,我们通过ApplicationContext相关子类启动Spring容器,然后加载相关的Bean配置文件。但是在OSGI应用中Spring框架的启动由Blueprint负责,默认情况下会加载META-INF/spring/*.xml文件,并实例化这些配置文件中的Bean。

需要注意的是Gemini Blueprint支持Blueprint风格和Spring风格的Bean配置,接下来我们可以在com.csdn.osgi.common工程的META-INF目录下新建一个spring目录,然后新建一个beans.xml文件,如下图:
这里写图片描述
然后在beans.xml文件中增加Blueprint风格的Bean配置,内容如下:

<?xml version="1.0" encoding="UTF-8"?><blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">    <bean id="object" class="java.lang.Object"/>    <bean id="length" class="java.lang.Integer">        <argument value="4"/>    </bean>    <bean id="buffer" class="java.lang.StringBuffer" depends-on="simple">        <property name="length" ref="length"/>    </bean>    <bean id="current-time" class="java.lang.System" factory-method="currentTimeMillis" scope="prototype"/>    <bean id="list" class="java.util.ArrayList" destroy-method="clear" activation="eager">        <argument ref="length"/>    </bean></blueprint>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

然后重新启动Equinox容器,控制台中输出日志内容如下:

hello world!十二月 18, 2016 10:50:57 下午 org.eclipse.gemini.blueprint.extender.internal.boot.ChainActivator <init>信息: Blueprint API detected; enabling Blueprint Container functionality十二月 18, 2016 10:50:57 下午 org.eclipse.gemini.blueprint.extender.internal.activator.LoggingActivator start信息: Starting [org.eclipse.gemini.blueprint.extender] bundle v.[2.0.0.M02]osgi> 十二月 18, 2016 10:50:57 下午 org.eclipse.gemini.blueprint.extender.internal.support.ExtenderConfiguration start信息: No custom extender configuration detected; using defaults...十二月 18, 2016 10:50:57 下午 org.springframework.scheduling.timer.TimerTaskExecutor afterPropertiesSet信息: Initializing Timer十二月 18, 2016 10:50:57 下午 org.eclipse.gemini.blueprint.extender.support.DefaultOsgiApplicationContextCreator createApplicationContext信息: Discovered configurations {osgibundle:/META-INF/spring/*.xml} in bundle [Common (com.csdn.osgi.common)]十二月 18, 2016 10:50:57 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh信息: Refreshing OsgiBundleXmlApplicationContext(bundle=com.csdn.osgi.common, config=osgibundle:/META-INF/spring/*.xml): startup date [Sun Dec 18 22:50:57 CST 2016]; root of context hierarchy十二月 18, 2016 10:50:57 下午 org.eclipse.gemini.blueprint.context.support.AbstractOsgiBundleApplicationContext unpublishContextAsOsgiService信息: Application Context service already unpublished十二月 18, 2016 10:50:57 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions信息: Loading XML bean definitions from URL [bundleentry://9.fwk182531396/META-INF/spring/beans.xml]十二月 18, 2016 10:50:58 下午 org.eclipse.gemini.blueprint.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor stageOne信息: No outstanding OSGi service dependencies, completing initialization for OsgiBundleXmlApplicationContext(bundle=com.csdn.osgi.common, config=osgibundle:/META-INF/spring/*.xml)十二月 18, 2016 10:50:58 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1103899a: defining beans [object,length,buffer,current-time,list]; root of factory hierarchy十二月 18, 2016 10:50:58 下午 org.eclipse.gemini.blueprint.context.support.AbstractOsgiBundleApplicationContext publishContextAsOsgiServiceIfNecessary信息: Publishing application context as OSGi service with properties {org.eclipse.gemini.blueprint.context.service.name=com.csdn.osgi.common, org.springframework.context.service.name=com.csdn.osgi.common, Bundle-SymbolicName=com.csdn.osgi.common, Bundle-Version=1.0.0.qualifier}十二月 18, 2016 10:50:58 下午 org.eclipse.gemini.blueprint.extender.internal.support.DefaultOsgiBundleApplicationContextListener onOsgiApplicationEvent信息: Application context successfully refreshed (OsgiBundleXmlApplicationContext(bundle=com.csdn.osgi.common, config=osgibundle:/META-INF/spring/*.xml))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

日志内容说明Spring框架已经成功启动,并且Bean已经成功创建。
除此之外,Gemini Blueprint还支持Spring风格的Bean配置,例如我们可以將上面的beans.xml文件内容修改成下面的配置:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"    default-lazy-init="true">    <bean id="object" class="java.lang.Object"/>    <bean id="length" class="java.lang.Integer">        <constructor-arg value="4"/>    </bean>    <bean id="buffer" class="java.lang.StringBuffer" depends-on="simple">        <property name="length" ref="length"/>    </bean>    <bean id="current-time" class="java.lang.System" factory-method="currentTimeMillis" scope="prototype"/>    <bean id="list" class="java.util.ArrayList" destroy-method="clear" lazy-init="false">        <constructor-arg ref="length"/>    </bean></beans>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

重新启动Equinox容器也是没有问题的,Spring框架能够正常启动,Bean也能够正常实例化,到此为止,我们已经成功使用Blueprint整合到Spring框架中。

这篇文章暂时就介绍这么多,也到休息时间了,后面的文章中继续介绍如何与Mybatis框架和Spring MVC整合,并开发一个简单的登录功能。如果发现文章内容有不当的地方,希望能够指出来,有任何疑问也可以在评论中提出,转载请注明本文地址!

本文源码下载地址:http://download.csdn.net/detail/rongbo_j/9715778

0 0
原创粉丝点击