打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
spring+osgi 动态模型一: Bundles和Application Contexts
1、Bundles和Application Contexts
bundle是OSGi的部署(和模块)单元在OSGi运行时里的bundle具有如下三种状态:installed,resolved,active。
在Spring中最主要的单元模块是应用程序上下文(application context),在应用程序上下文里包括了一些bean(被Spring的应用程序上下文所管理的对象)。
在OSGi bundle和Spring应用程序上下文之间有很自然的紧密联系。使用Spring Dynamic Modules,一个active的bundle可以包含一个Spring 应用程序上下文,它负责在bundle里实例化、配置、组装和装饰对象(bean)。这些bean即可作为OSGi服务输出而提供给其他bundle,也能透明地注入其他OSGi服务的引用。
2 、Spring Dynamic Modules 扩展器(Extender)包
Spring Dynamic Modules提供了一个OSGi bundle:org.springframework.osgi.bundles.extender,这个bundle负责为应用程序Bundle实例化Spring应用程序上下文。它的功能和用于Spring web应用程序的ContextLoaderListener(http://static.springframework.org/spring/docs/2.5.x/reference/webintegration.html)一样。一旦extender bundle被安装和启动,它就会寻找所有具有Spring权限且已经在ACTIVE状态的bundle,并且替它们创建应用程序上下文。另外extender bundle还监听bundle启动事件和为所有后启动的具有Spring 权限的bundle创建应用程序上下文。“bundle格式和Manifest头条目”描述了extender bundle怎样识别“具有Spring 权限的bundle”
3、Bundle生命周期
OSGi是一个动态的平台:bundle可以在框架运行时的任何时候被安装、启动、更新、停止和卸载。
当一个活动的bundle被停止,任何在它的生命周期里输出的服务都会自动被卸载,而且之歌bundle将会变成resolved状态。一个停止了的bundle会释放它所有的资源和线程。被一个停止了的bundle所导出的包(Package)对于其他bundle来说仍然是可用的。
一个resolved状态的bundle可能被卸载:一个被卸载的bundle导出的包对于其他已经导入它的bundle仍然是可用的(但是对于新安装bundle却不可用)。
一个resolved状态的bundle仍然可能被更新。更新操作用于bundle从一个版本移植为另外一个版本。
最后当然,一个resolved状态的bundle可以被启动,使得它变成活动状态。
OSGi的PackageAdmin 的refreshPackages操作可以刷新整个OSGi框架或一个指定的已安装bundle子集。在刷新的时候,受影响的bundle应用程序上下文会被停止和重启。在refreshPackage操作之后,由老版本bundle导出的包,或者被卸载了的bundle到处的包将不再可用。详见OSGi规范。
当一个具有Spring权限的bundle被停止,为其创建的应用程序上下文会被自动销毁。所有由该bundle导出的服务会被注销(从服务注册表里移除),而且正常的应用程序上下文
注销将被执行(在上下文里bean实现了org.springframework.beans.factory.DisposeableBean接口,destroy-methods回调函数将被调用)。
如果一个已经停止的具有Spring权限的bundle随后被重启了,会为之创建一个新的应用程序上下文。
4、Bundle上下文(BundleContext)
OSGi应用程序上下文由Spring extender创建,上下文里包含了一个类型为BundleContext、名为bundleContext的bean,你可以在应用程序上下文里将该bean的引用注入到任何bean里,无论是使用名称(by-name)还是使用类型(by-type)。另外Spring Dynamic Modules 定义了接口:org.springframework.osgi.context.BundleContextAware:
public interface BundleContextAware {
public void setBundleContext(BundleContext context);
}
任何实现了该接口的bena在它被Spring配置时会注入一个bundle上下文的引用。如果你想在bundle里使用这种特性,记住导入在你的bundle的manifest里导入包:org.springframework.osgi.context。
应用程序上下文销毁
应用程序上下文被绑定到它所生存的bundle上。因此,如果bundle被关闭,上下文会同时被销毁,所有输出的服务会被注销,所有导入的服务会被释放。
注意无论如何,一个bundle可以被单独关闭或者作为例如关闭整个OSGi平台的这样的大事件的一部分关闭。在这种情况下或者当extender bundle被关闭时,受管理的应用程序上下文会被以一种受控的方式,按照服务之间的依赖性来关闭
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Step-by-step: Spring in Eclipse RCP Applications
自己的osgi收藏(比较详尽的osgi学习文档)四spring
Spring and OSGi
为 WebSphere Application Server 开发企业 OSGi 应用程序
Spring框架的核心是什么
初探Java企业级开源框架OSGi
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服