??xml version="1.0" encoding="utf-8" standalone="yes"?> OSGI Eclipse Plugin定义 Eclipse Plugin Framework ȝ 带来的思?BR>Eclipse Plugin Framework采用的是OSGI的实玎ͼ一定程度上我们也能看到OSGI的优点,那么JMX+IoC方式的Plugin Framework与其的比较又是在哪些斚w呢?Eclipse Plugin Framework不的地方又在哪里呢Q哪些地方值得改进呢?Q。但q没有深入它的代码,对它的流E当时了解过Q不q现在忘?IMG height=19 src="http://www.tkk7.com/Emoticons/cry_smile.gif" width=19 border=0>Q唉Q岁月不饶hQ不服老不行,看着记性!
先把struts做个Introduction吧,正好在介l的同时也给自己一个整理的ZQ看了一天了Q整理一下思\吧!
首先讲到strutsQ就不能不提Model 2Q讲到Model 2׃能不提到Model 1Q?IMG height=19 src="http://www.tkk7.com/Emoticons/51_51.gif" width=19 border=0>Q,其实Q这三者都M开一个东西,是java中web application里面的最基本也是最重要的东西,servletQ不错,我认为它是个基础Q个人看?)Qservlet是个好东西,sun公司认ؓ有两U类型的web applicationQ?、Presentation-oriented 2、Service-oriented。随着Web被逐渐用于deliver serviceQ那些service providers逐渐认识到在Web中提供动态内容的重要性。随之出CCGI。CGI的缺Ҏ׃说啦Q其实我没大用过CGIQ汗一个!不过据说是有很多~点的,比如q_相关性,lack of scalability。于是servlet适时而出了!
关于servlet的细节我׃具体提了Q我也有待学习,q里之所以提到servletQ是因ؓstruts中的一个核心部件就是一个servletQ所以在q里单提一下servletQ以供读者检查自己是否应该先M解一下servlet。Model 1单讲是只用JSPQ而不用servletQ这里的用与不用Q仅是对web开发h员而言Q因为JSP最l还是会被translate为servletQ这里用translate是遵照官方用词,国内很多书翻为编译,个h认ؓ不是很恰当)。其实出现Model 1的原因也很简单,因ؓ用servlet来构造一个网不胜其烦,一堆的out.pringln(...)让h整个感觉是手工构造一个网,在这个所见即所得的今天Q我们可能永q无法想象它的繁琐性!于是出现了JSPQ把那些工作交给了web containerQ我们只需用所见即所得的tool构造webQ然后在web中适当的地方加入java代码卛_。好Q点Cؓ止,再具体就是jsp的内容了。但后来Z发现Q完全抛弃servletq不是一个好的ideaQ其中的一个关键问题就是content与presentationh在一P非常不利于维护和修改。于是h们又提出了结合jsp与servlet来开发webQ这是Model 2Q它本质上是l典MVC模式的一个变U。这里推荐一文?A href="http://http://www.javaworld.com/javaworld/jw-12-1999/jw-12-ssj-jspmvc.html">Understanding JavaServer Pages Model 2 architecture Q专门介lModel2的,希望对大家有所帮助Q这也是struts官方|站上推荐的一文章!׃我们的主题是strutsQ所以我们就不细谈这文章了?BR>当然我也希望读者对MVC模式有所了解Q如果否Q请?A >MVC的源头。了解一下它吧,一个很好的东东Q?BR>好,准备东西讲完了,我们下面开始看strutsQ?BR>struts从结构上讲是W合Model2的,先简单介l一下它的情况,它的目的是要解决Model 1中的flow control的问题,q得内容(ModelQ与表现QViewQ彻底分RStruts是在2000q?月由Craig R. McClanahan发v的。ƈ?001q?月发布了1.0版?休息一下)
]]>
]]>
最后祝我的亲朋好友新年都万事如意!也祝愿未来公司的事业蒸蒸日上Q?img src ="http://www.tkk7.com/linq/aggbug/26241.html" width = "1" height = "1" />
]]>
Eclipse中最出彩的部分莫q于它的Plugin FrameworkQ可以说Eclipse在一定程度上使得Plugin机制得以行Q当ӞEclipse的优势不仅仅在此Q但正因为采用了Plugin机制QEclipse才得以被不断的扩充,来强大。一直以来就惛_析Eclipse的Plugin FrameworkQ由于各U原因一直耽搁Q刚好这个周末没什么事Q下定决心对其进行了研究和分析,Ҏ很原始,是对Eclipse的启动过E进行分析,Z的是Eclipse 3.1的版本,分析q程׃在这说了Q主要是说说分析出来的心得?BR>架构上来讲Eclipse基本采用的是Kernel+Core Plugins+Custom Plugins的结构体p,除了Kernel部分外均为PluginQ所以可UCؓall are pluginsQ凡是Plugin的部分都是可被替换的?/P>
Eclipse 3.0后采用的是OSGI来作为其Plugin Architecture实现的依据,鉴于此就得简单提提OSGI了,主要从Plugin的角度来分析OSGIQOSGI概念中主要分ZBundle和ServiceQ可以认为Bundle是一个模块的理器,主要是通过BundleActivator理模块的生命周期,而Service则是q个模块可暴露对外的服务对象Q这里体COSGI和传l的Plugin Framework不同的一个地方,理和静态结构分开Q在OSGI中通过在manifest.mf文g中增加一些内Ҏ发布BundleQ在其中描述了Bundle的提供商、版本、唯一ID、classpath、暴露对外的包、所依赖的包Q每个Bundle拥有自己的ClassLoader以及contextQ通过context可进行服务的注册、卸载等Q这些操作都会通过事g机制q播l相应的其他的BundleQ一般来说都为通过在Bundle中编写初始需要注册的服务的方法来完成Bundle可供外部使用的服务的暴露功能Q如需要调用其他Plugin提供的服务可通过context的getServiceReference先获取Service的句柄,再通过context.getService(ServiceReference)的方法获取Service的实体?/P>
Eclipse中的Plugin的概念ؓ包含一pd服务的模块即Z个Plugin。既然是遵@OSGI的,也就意味着Plugin通常是由Bundle和N多Service共同构成的,在此基础上Eclipse认ؓPlugin之间通常存在两种关系Q一Uؓ依赖Q一Uؓ扩展Q对于依赖可通过OSGI中元描述信息里添加需要引用的Plugin卛_实现Q但扩展在OSGI中是没有定义的,Eclipse采用了一个Extension Point的方式来实现Plugin的扩展功能?BR>l合OSGI
Eclipse遵@OSGI对于Plugin的ID、版本、提供商、classpath、所依赖的plugin以及可暴露对外的包均在manifest.mf文g中定义?BR>Plugin Extension Point
对于扩展QEclipse采用Extension Point的方式来实现Q每个Plugin可定义自qExtension PointQ同时也可实现其他Plugin的Extension PointQ由于这个在OSGI中是未定义的Q在Eclipse中仍焉过在plugin.xml中进行描qͼ描述的方法ؓ通过<extension-point id="" name="" schema="">的Ş式来定义Plugin的扩展点Q通过<extension point="">的Ş式来定义实现的其他Plugin的扩展点Q所提供的扩展点通过schema的方式进行描qͼ详细见eclipse extension-point schema规范Qؓ了更好的说明扩展点这个概念,举例如下Q如工具栏就是工hPlugin提供的一个扩展点Q其他的Plugin可通过此扩展点d按钮臛_h中,q可相应的添加按钮所对应的事?当然Q此事g必须实现工具栏Plugin此扩展点所要求的接?Q工h的Plugin通过callback的方式来相应的响应按钮的动作。可见通过Extension Point的方式可以很好的提供Plugin的扩展方式以及实现扩展的方式?/P>
那么Eclipse是如何做到Plugin机制的实现的呢?Q还是先讲讲Eclipse的设计风|Eclipse在设计时有个重要的分层法则,卌a层相兛_语言层无关的代码分开(如jdt.core和core)Q核心与UI分开(如workbench.ui和workbench.core)q两个分层法则,q个在Eclipse代码中处处可见,在Plugin Framework部分也充分得体现了这个,遵@OSGIQEclipse首先是实C一个OSGI ImplQ这个主要通过它的FrameWork、BundleHost、ServiceRegistry、BundleContextImpl{对象来实现Q如果关心的话大家可以看看这部分的代码,实现了Bundle的安装、触发、卸载以及Service的注册、卸载、调用,在Plugin机制上Eclipse采用的ؓlazy load的方式,卛_调用时才q行实际的启动,采用的ؓ句柄/实体的方式来实现Q外部则通过OSGIq行启动、停止等动作Q各Plugin则通过BundleContext来进行服务的注册、卸载和调用Q这是OSGI的部分实现的单介l?BR>那么Extension Point斚wEclipse是如何实现的呢,在加载PluginӞEclipse通过对plugin.xml的解析获取其中的<extension-point>节点?lt;extension>节点Qƈ相应的注册到ExtensionRegistry中,而各个提供扩展点的Plugin在提供扩展点的地方进行处理,如工hPlugin提供了工h的扩展点Q那么在构成工具栏时Plugin通过Platform.getPluginRegistry().getExtensionPoint(扩展点ID)的方法获取所有实现此扩展点的集合IExtensionPoint[]Q通过此集合可获取IConfigurationElement[]Q而通过q个可以获?lt;extension point="">其中的配|,同时q可通过IConfigurationElement创徏回调对象的实例,通过q样的方法Eclipse也就实现了对于Plugin的扩展以及扩展的功能的回调。在Plugin Framework中还涉及很多事g机制的用,比如Framework的事件机Ӟ以便在Bundle注册、Service注册的时候进行通知?/P>
通过对Eclipse启动q程的分析,可清晰的看到Eclipse Kernel+Core Plugins+Application Plugins的方式,在代码中分别对应为loadBasicBundles和registerApplicationServicesQloadBasicBundles通过加蝲config.ini中的osgi.bundles完成基本的bundles的加载,ȝ看这个配|会发现是org.eclipse.core.runtimeq有一个updateQcore.runtime又会通过IDEApplication来完成整个Eclipse的启动,同时会注册所有与workbench相关的plugin?BR>Eclipse׃以前版本的Plugin Framework是没有采用OSGI的,所以通过EclipseAdaptor的方式来实现与以往的兼容,目前新的Plugin采用的方式基本就是manifest.mf描述Plugin OSGI部分的信息,Plugin.xml描述扩展点的信息?BR>Eclipse中有非常多优U的设计,q个在看它的代码时会有很q感触Q比如Contributing to Eclipse中提到的Extension Object/Interface的设计,实是非常的不错Q虽然看C可能觉得很简单,关键是要惛_到ƈ合适的M用?BR>ȝ陈词Q^_^QEclipse Plugin Framework是采用OSGI Impl+Plugin Extension-Point的方式来共同实现的,实现了Plugin的部|Ӏ编写、独立的Classloader和Context、Plugin中Service的注册、Plugin中Service的调用、Plugin的依赖、Plugin的扩展、Plugin生命周期的管理?/P>
]]>Q莉也同意了Q但是当我们到达麦当xQ我们发玎ͼq汉堡也要跟我们?8了,p样一个圣诞节q了快一半了Q我们连个坐下的位子都还没找到。打道回府,我们军_d金润发旁边的一家西厅Q我想那里远L街口Q应该h一点吧?BR>当我们冲q去的时候,服务员微W着Ҏ们说“欢q光临”,我知道这ơ有戏了Q可是她却把我们引到了一个最角落里的位子Q这到无所谓,关键是那个位子正对着金润发,而且有个ȝ门,q出出,而且很吵Q于是我们愤而离开Q该ȝ圣诞节,或许我们应该留在学校吃食堂的Q我们俩都有了这个想法,但是已经折腾q么久了Q我们都不甘心,我们军_d我们曾\q的一家烧烤店Q\上遇C个卖掉渣饼的摊Q莉怕我饿了又发脾气Q她的经?IMG height=19 src="http://www.tkk7.com/Emoticons/red_smile.gif" width=19 border=0>Q就C一个,我们边走边吃Q味道确实还不错Q我们商量着待会吃完饭再来买一?..
虽然烟雾~绕Q但毕竟q有位子Q我们终于坐下了Q开始了我们O的^安夜大餐...
]]>Q是在迎新晚会上演出的,自己觉得自己蛮投入的Q也可以看得出来Q我们这个剧l的其他成员也都很投入,当然演出效果也比较o人满意,臛_观众反映q是不错的,着实o人欣慰。不q,参加q个剧组Q却让我体会C另外一U感觉,那就是团队合作的_Q其实我觉着在这斚wQ我们现在很多h都存在着不Q但是很多h却没有意识到Q而这ơ的合作Q让我对团队_有了新的理解Q首先要有团队意识,比如开会,你要想着不能q到Q因为如果你q到Q等待你的将是整个团队,你浪费了所有h的时_所以要心有团队。其ơ,团队说白了其实就是由很多人组成的Q所以你必须同团队里的每个h交互Q有旉要保留个人意见,有时需要及时纠正别人的做法Q也是说团队最后的走向取决于大家的合力Q如果一个团队里面大多数人都很消极或者说做错了,那么可想而知q个团队的结果是什么了Q要么解散,要么演出p|。最后一点团队需要一个有力的“领导”,我这里对领导加引P是因为我q不是说领导代表一U权利,高h一{,随便发号施oQ我认ؓ领导在团队中的作用是协调、沟通,在团队中存在争议Ӟ能迅速解决争议,使的团队的进步不因个人的问题而停止或中断Q另外对团队领导的要求就是要有计划,有合理的安排Q得每个h能够量独立的发挥自q聪明才干?/SPAN>
与此同时Q我又参加了整场晚会的场地负责工作,包括预定场地、入场检、分发食品、颁奖、音乐控制等。由于缺乏经验加之没有计划好Q晚会刚开始的时候,场地一片乱,入场处拥挤不堪,音乐控制处找不到伴奏带等Q我是又忙又急,q好在大家的集体努力下,很快扭{了局面,也我再一ơ感受到了团队的力量?/SPAN>
ȝhQ这ơ晚会之所以出现开场时的乱局面,我认为有以下几个原因Q?/SPAN>
1?SPAN style="FONT: 7pt 'Times New Roman'"> 我们工作人员入场太晚Q而这又是因ؓ我们跟场地预定处没协调好
2?SPAN style="FONT: 7pt 'Times New Roman'"> 食品与奖品等q到现场也太晚,直接D了入场检一度无法做Q以及音乐控制处在等节目单和伴奏?/SPAN>
3?SPAN style="FONT: 7pt 'Times New Roman'"> 整体没有配合好,比如场地如何布置Q没有h告诉我们该如何安排,D后来节目快开始的时候又重新安排
q又使我惌v莉莉Q偶GFQ的一句常说的话,“凡事尽量提前准备好”,不错Q这ơ我们就是在没有提前准备好,D了现场的混ؕ?/SPAN>
对于我个人来_q的是W一ơ负责这U工作,所以没有什么经验,对于H发情况的处理显得手x措,但同时也l我一ơ锻炼的ZQ虽然当时说了很多抱怨的话,但其实我q是不后悔负责这个工作,因ؓ它让我领会到一个小的zdQ想要把它搞好,也ƈ不是很容易的。“麻雀虽小Q五脏具全”嘛Q?/SPAN>