之前也写过关于Service-Oriented Component Model的blog了,Service-Oriented Component Model(以下简称SOCM)是OSGi R4中最为重要的改进,SOCM也是切实体现OSGi的动态性的模型,大家在使用SOCM的时候可能会因为受到原有思想的影响而一时无法理解,在这篇blog中将再次的对SOCM进行讲解,以便大家能够更好的理解和进行运用。
SOCM是一种模块化的详细设计思想,不属于架构级别的思想,相应的我们对比一下传统情况下基于Spring的模块化详细设计,在Spring中,对于一个模块的详细设计,通常可以这么来简述,模块由多个bean共同构成,bean通过注入其他bean实现的接口来获取相应的功能,同样通过实现接口来对外提供功能(加上xml中的描述),在系统启动时默认情况下所有的bean都自动的初始化了,当然,也可以通过类似lazy的属性使得bean延迟的进行加载,在bean启动后其依赖关系就已经确定,是一种静态的依赖关系,bean的生命周期可通过spring提供的接口来进行管理。
通常来讲习惯了基于spring实现的同学们在转变到使用SOCM时会碰到一些问题:
1、怎么样注入其他Component?
这个思想呢,我个人觉得是在使用spring时本来就有些错误了,注入思想最重要的就是接口注入,所以在说注入其他Component这句话上是有一定的概念性的错误的,每个Component其实都是通过set接口来获得相应接口的功能,按照SOCM的说法,就是每个Component通过bind相应的服务的接口来获取需要使用的功能。
在SOCM中,要引用其他的Service非常的简单,和Spring的DI没有很大的区别,也可以通过setService这样的方法来实现,和spring的不同只是spring在设置bean的依赖时是通过ref bean="beanID"来获取,而SOCM中呢,则是充分的Service-Oriented的表达方式:
<reference name="LogService" interface="org.osgi.service.log.LogService" bind="setLog" unbind="unsetLog" policy="dynamic"/>
通过的是interface属性来获取到所需的服务,而不是通过ref bean的那种方式,这里也是充分表达SOCM是一种动态化设计的思想。
2、怎么样管理Component的生命周期?
这是大家最为迷惑的,当你查遍OSGi的相关文档后,会发现OSGi是没有提供接口来外部调用Component的呢,这和Spring提供了接口调用bean完全不同,在SOCM中Component的生命周期是由OSGi框架来负责管理的,外部没法通过接口去调用某个Component,这就会使大家产生疑问,那么Component中的方法是怎么被执行的呢,对于这个疑问,需要分成两种形式的Component来看待:
(1)、只引用其他Service的Component;
对于这种类型的Component,在启动Bundle后OSGi将会自动的对Component进行激活,Component激活的前提是Component所引用的Service满足条件,Component激活时将会通过调用bind属性对应的方法将相应的服务注入,在将所需的服务均注入后,将会调用Component中的activate方法,如没有此方法,则不进行调用,:),在这种情况下,我们会发现以前Bundle中的BundleActivator通常都会变得没有意义,完全可以通过编写一个POJO的Component来实现同样的功能和效果,而且更为简单。
对于这种Component,我们现在可以清楚,只要Component所必须需要的服务都存在,那么它就会被自动的激活,这种Component的例子可以参见OSGi Opendoc所附带的ds部分代码中的LoginServlet。
(2)、对外提供Service的Component;
如果Component对外提供了Service,那么只有当这个service需要被使用时Component才会被激活,这是它区别于第一种形式Component的地方。
对于这种Component,可以参见OSGi Opendoc所附带的ds部分代码中的DBValidatorImpl(如果你想看它是什么时候被激活的话,可以增加一个activate(ComponentContext context)方法来确定)。
其实对于上面两种形式Component的激活原理,我们从设计角度去看的话很容易理解,第一种Component相当于消费型的,这种Component自然是直接就需要启动了,而对于第二种呢,是提供服务型的,当没人需要服务的时候,自然没必要激活了。
为什么Component的生命周期需要交给OSGi框架去管理,而不能通过外部管理呢,这就是OSGi动态性特征的表现,Component什么时候能激活取决于系统运行时的状况,这和静态的设计思想是完全不同,例如当Component所必须的服务在系统中突然不存在了时,这个时候Component将会变成不激活的状态,这和传统的静态化的bean有很大的不同,Component的状态是会根据运行时的情况来动态改变的,这自然是远强于静态化的bean的系统了。
其实从上面的问题可以看出,当你将基于Spring的模块移植到OSGi中时,我相信你的系统的设计会随着使用SOCM而得到明显的提升,真正的做到面向服务、面向接口,SOCM本身就是一种很好的SOA的实现模型,在理解SOCM时,最重要的主要是要把握SOCM的三个核心思想:
1、模块是由一堆Component组成的;
2、Component通过注入服务接口和提供服务接口来实现Component之间的依赖设定,服务接口是Component之间依赖的桥梁;
3、Component的生命周期是由OSGi框架管理的。
其实上面仍然只是简要的讲了讲SOCM,SOCM在动态化的表现上其实还有更多的东西,象cardinality、policy、filter等等。
OSGi中实现SOCM的是Declarative Services,不能说SOCM就没有缺点了,SOCM没有提供调用Component的接口(准确的说应该是外部调用SOCM中的Service,例如要在普通的java object中调用SOCM中的service,目前是没办法的,只能把那个java object也作为Component才行),这也就使得系统必须完全遵循SOCM而构建,这使得基于SOCM而构建的模块很难与本地的程序做集成,这是它的一个缺点,但是这里面确实有个问题,就是OSGi的Component是动态化的,其实它是无法简单的通过提供一个接口来对外部的程序提供SOCM中的service的,必须同时还附带一个通知模型,以便在service状态发生改变时外部的程序能够得知,从而做出相应的动作,这个问题在SCA中是得到解决了的,EEG对这个问题也表示了关注,可以相信在不久的将来SOCM将会更加的完善和实用。
ps:之前看EclipseCon 2007中OSGi Long Talks的时候看到Bea的microServices也是基于OSGi的,:),果然没有出乎意料,也就是说BEA的所有软件产品将全部基于OSGi了,这对于OSGi的推进无疑是个很好的消息,呵呵,看来IBM的动作还得加快。
另外说说最近Equinox的一个最好的消息,那就是它的基于aspect实现AOP的bundle已经推出,:),可以想想这意味着什么,意味着面临的很多企业应用的问题就得以解决了,象跨Bundle的事务等等..
分享到:
相关推荐
The ability to adapt to different computing environments or external changes is an important requirement for both ...providing a service-oriented component model is the OSGi Service Platform.
5. **Service-Oriented Architecture with OSGi**: Exploring how to design and implement SOA principles within the OSGi framework, focusing on loose coupling and service orientation. 6. **Advanced Topics...
在企业级软件开发中,服务体系架构(Service-Oriented Architecture,简称SOA)是一个重要的设计模式,它强调以服务为中心的架构,使得不同系统间的功能可以通过标准化的服务接口进行互操作。SOA的核心是组件化,...
【清华大学】DeepSeek从入门到精通(视频课程+PDF)
自2019年以来,教育部启动实施“双高计划”,遴选确定首批“双高计划”建设单位197所,其中高水平学校建设单位56所,高水平专业群建设单位141所,河南省有黄河水利职业技术学院、河南工业职业技术学院等6所职业学校入选。2022年,教育部开展国家“双高计划”中期绩效评价,从评价结果看,国家“双高计划”任务进展顺利,建设成效突出,形成了一批先进经验做法和典型案例,在引领职业教育改革、服务国家战略和支撑区域发展方面形成示范势头。 今天,我们给大家分享一些“双高计划”专业群完整申报书与建设方案和中期评估报告。 ## 一、专业群完整申报书与建设方案 ## 二、“双高计划”中期报告 (100多份)
内容概要:本文详细探讨了电商平台上秒杀系统中减库存的设计逻辑和技术优化方法。首先,文中阐述了‘下单减库存’、‘付款减库存’和‘预扣库存’三种常见方式及其各自面临的问题和局限性,尤其是面对高并发流量冲击下的系统稳定性与数据准确性保障挑战。接着讨论了适用于大规模促销活动中快速而精准地扣除存货的方法,提出了诸如应用本地缓存(Local Cache)、引入高性能持久化键值存储(如Redis),甚至修改数据库引擎源代码(InnoDB 层面排队机制)等一系列先进解决方案来确保交易流程顺畅。此外,还提到了在极端情况发生(例如超卖)时如何借助补救措施挽回损失的具体实例。 适合人群:电商平台开发运维技术人员;有兴趣深入了解电商业务架构和技术优化的开发者和IT管理人员。 使用场景及目标:①帮助设计师理解不同减库存策略的应用时机及其利弊;②指导程序员针对特定业务需求选择最适合的技术路径进行项目构建;③提供给运维专家关于改善在线交易平台响应速度和服务质量的专业见解。 其他说明:本篇文章对于构建高效的电子商贸系统有着极高的参考价值,尤其是那些准备应对瞬息万变市场环境下的企业来说尤为重要。它不仅限于理论探讨层面,
动态表单,VUE动态表单。基于vue+elementplus实现动态表单组件,通过拖拽组件到面板即可实现一个表单。支持各个组件的动态隐藏显示,动态表格弹窗式维护。
【毕业设计】java-springboot-vue家居日用小百货交易网站实现源码(完整前后端+mysql+说明文档+LunW).zip
【毕业设计】java-springboot+vue火锅店管理系统源码(完整前后端+mysql+说明文档+LunW).zip
随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了微服务在线教育系统的开发全过程。通过分析微服务在线教育系统管理的不足,创建了一个计算机管理微服务在线教育系统的方案。文章介绍了微服务在线教育系统的系统分析部分,包括可行性分析等,系统设计部分主要介绍了系统功能设计和数据库设计。 本微服务在线教育系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,课程信息管理,课程类型管理,学科管理,购买的课程管理,职业规划管理,视频点播管理,我的笔记管理,我的课程管理,消息通知管理,学习交流,试卷管理,留言板管理,试题管理,系统管理,考试管理。用户功能有个人中心,用户管理,购买的课程管理,我的笔记管理,我的课程管理,消息通知管理。因而具有一定的实用性。 本站是一个B/S模式系统,采用SSM框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得微服务在线教育系统管理工作系统化、规范化。本系统的使用使管理人员从繁重的工作中解脱出来,实现无纸化办公,能够有效的提高微服务在线教育系统管理效率。 关键词:微服务在线教育系统;SSM框架;MYSQL数据库;Spring Boot
javascript 基于Javascript实现,强化学习QLearning的一个贪吃蛇实例.
python教程学习
我国科学技术的不断发展,计算机的应用日渐成熟,其强大的功能给人们留下深刻的印象,它已经应用到了人类社会的各个层次的领域,发挥着重要的不可替换的作用。信息管理作为计算机应用的一部分,使用计算机进行管理,具有非常明显的优点,利用网络的优势特开发了本基于Spring Boot的IT技术交流和分享平台。 本IT技术交流和分享平台是基于Spring Boot框架,采用Java技术,MYSQL数据库进行开发的。系统具有灵活的一体化设计方式,圆满完成了整个系统的界面设计。本系统实现了用户功能模块和管理员功能模块两大部分,通过该系统用户可以快速进行IT技术交流和分享,管理员可登录系统后台对系统进行全面管理,确保系统正常稳定的运行。系统功能齐全,符合用户IT技术交流和分享的需求。 本文主要首先介绍了课题背景、设计原则和研究内容,系统采用的相关技术及开发平台,接着对本基于Spring Boot的IT技术交流和分享平台进行系统需求分析和设计,包括系统的功能模块,数据库的设计,系统结构以及系统界面设计等,最后对进行系统测试,完成本篇论文。 关键词:IT技术交流, Spring Boot框架, Java技术,MYSQL数据库
疲劳检测yawn图片数据集
JDK7通过java-jwt验证
【毕业设计】java-springboot+vue会议管理系统实现源码(完整前后端+mysql+说明文档+LunW).zip
python学习资源
51CTO 1、技术解析篇-DeepSeek入门宝典 2、开发实战篇-DeepSeek入门宝典 3、行业应用篇-DeepSeek入门宝典 4、个人使用篇-DeepSeek入门宝典
内容概要:本文档是由高正奇编辑的针对模式识别和机器学习(PRML)教科书的一份详细的解答手册。文档覆盖了从基本概念如误差函数求导、贝叶斯定理应用到多元高斯分布计算、Gamma函数积分及其性质等一系列复杂问题的解决方案,以及涉及线性模型分类的基础练习题、条件概率和联合概率计算等入门级习题。每一题都经过细致推导,帮助学生加深对机器学习相关概念的理解并掌握具体的数学方法。 适合人群:主要适用于正在攻读机器学习、模式识别相关课程的学生,以及从事数据科学工作的专业人士作为深入理解和实践指南。 使用场景及目标:本手册旨在辅助教学过程中遇到的具体难题解析,在研究和实践中作为参考资料进行理论验证和技术难点突破,尤其有助于准备考试或者项目实施时需要巩固知识的应用场合。 其他说明:书中题目涵盖广泛,既有直观的概率论应用,也有复杂的积分变换技巧和最优化思路展示,对于希望提高自身计算能力和解决实际问题能力的学习者非常有价值。但要注意的是,部分内容较为深奥,可能不适合初学者自学使用,最好配合课堂讲解或其他教材一起学习效果更佳。