现在的eclipse都已¾l包å«äº†EquinoxåQŒæ— 需å•独下è²ã€?br /> 2. å¼€å‘OSGiçš„HelloWorld应用½E‹åº
在这一节,我们ž®†å¼€å‘一个OSGi bundleåQŒæ¼”½Cºå¦‚何利用Equinox˜q›è¡ŒOSGi bundle的开å‘ã€è¿è¡ŒåŠè°ƒè¯•åQŒäؓ之åŽçš„示例åšå‡†å¤‡ã€?br />
首先åQŒæ–°å»ÞZ¸€ä¸ªPlug-in工程åQŒå¦‚下图所½Cºï¼š
下一æ¥ï¼Œæ³¨æ„é€‰æ‹©ç›®æ ‡òq›_°åQŒé»˜è®¤äØ“Eclipse version *åQŒå°†å…¶æ”¹æˆEquinoxåQŒå¦‚下图所½Cºï¼š
ä¹‹åŽæŒ‰é»˜è®¤ä¸‹ä¸€æ¥å³å¯ï¼Œåˆ°æœ€åŽä¸€æ¥æ—¶åQŒæ— 需æ ÒŽ®æ¨¡æ¿åˆ›å¾å·¥ç¨‹åQŒåŽ»æŽ‰é»˜è®¤çš„å‹¾ï¼Œå¦‚ä¸‹å›¾ï¼š
点击完æˆåQŒåˆ›å»ºçš„工程目录如下图所½Cºï¼š
åœ¨å¼¹å‡ºçš„å¯¹è¯æ¡†ä¸åQŒæ–°å»ÞZ¸€ä¸ªOSGi Framework˜q行环境åQˆåŒå‡»OSGi Frameworkå›_¯åQŒè¿™é‡Œäؓ其å–åEquinoxåQ‰ï¼Œé€‰ä¸helloworld(1.0.0)åQŒç„¶åŽç‚¹å‡Õd³è¾¹çš„Add Required Bundles按钮åQŒeclipsež®†è‡ªåŠ¨é€‰ä¸˜q行helloworldçš„ä¾èµ–bundleåQŒå¦‚果有必è¦åQŒå¯ä»¥ç‚¹å‡Õd³ä¸‹çš„Validate BundleséªŒè¯æŒ‰é’®åQŒéªŒè¯ç¨‹åºæ£å¸¸è¿è¡Œæ‰€éœ€çš„bundle是å¦éƒ½è¢«é€‰ä¸åQŒæœ€åŽç‚¹å‡»è¿è¡Œï¼Œå›žåˆ°æŽ§åˆ¶åŽÍ¼š
osgi> Hello World!
å¯ä»¥çœ‹åˆ°åQŒä¹‹å‰åœ¨Activatorçš„startæ–ÒŽ³•ä¸çš„输出è¯å¥å·²ç»è¢«è¾“出到控制åŽÍ¼Œæˆ‘们å¯ä»¥é€šè¿‡å‘½ä×oss查看Equinoxçš„è¿è¡Œæƒ…况,å¯ä»¥çœ‹åˆ°ä¸€å…Þp¿è¡Œäº†ä¸¤ä¸ªbundleåQŒå¦‚下:
ss
Framework is launched.
id State Bundle
0 ACTIVE org.eclipse.osgi_3.4.3.R34x_v20081215-1030
1 ACTIVE helloworld_1.0.0
˜q˜è®°å¾—之å‰è®²åˆ°è¿‡çš„bundleçš„å‡ ¿U状æ€å§åQŸhelloworld已绘q行èµäh¥äº†ã€?br />
那么Equinox具体支æŒå“ªäº›å‘½ä×o呢?下表列出了主è¦çš„一些命令,如需查看更详¾l†çš„命ä×o清å•åQŒåˆ™å¯ä»¥åœ¨æŽ§åˆ¶å°é”®å…¥helpã€?/p>
¾cÕdˆ« |
命ä×o |
å«ä¹‰ |
控制框架 |
|
å¯åŠ¨æ¡†æž¶ |
|
åœæ¢æ¡†æž¶ |
|
|
å…³é—ã€é€€å‡ºæ¡†æž?/p> |
|
|
ç«‹å³é€€å‡ºï¼Œç›¸å½“äº?System.exit |
|
|
å¸è²æ‰€æœ?bundleåQˆå‰ææ˜¯å·²ç» shutdownåQ?/p> |
|
|
讄¡½®å±žæ€§ï¼Œåœ¨è¿è¡Œæ—¶˜q›è¡Œ |
|
控制 bundle |
|
安装 |
|
å¸è² |
|
|
å¯åЍ |
|
|
åœæ¢ |
|
|
åˆäh–° |
|
|
æ›´æ–° |
|
展示状�/strong> |
|
展示安装çš?bundle 和注册的æœåŠ¡ |
|
展示所æœ?bundle 的简å•状æ€?/p> |
|
s |
展示注册æœåŠ¡çš„è¯¦¾l†ä¿¡æ?/p> |
|
|
展示导入ã€å¯¼å‡ºåŒ…的状æ€?/p> |
|
|
展示所有已¾l安装的 bundles 的状æ€?/p> |
|
|
展示 bundles 的头信æ¯åQŒå³ MANIFEST.MF ä¸çš„内容 |
|
|
展示 LOG å…¥å£ä¿¡æ¯ |
|
其它 |
|
在å¦å¤–一个进½E‹ä¸æ‰§è¡Œä¸€ä¸ªå‘½ä»¤ï¼ˆé˜Õd¡žçжæ€ï¼‰ |
|
å’?EXEC ä¸åŒçš„æ˜¯ä¸ä¼šå¼•è“vé˜Õd¡ž |
|
|
促ä‹É垃圾回收 |
|
|
得到属性,或者æŸä¸ªå±žæ€?/p> |
|
控制å¯åЍ¾U§åˆ« |
|
得到æŸä¸ª bundle 或者整个框架的 start level ä¿¡æ¯ |
|
讄¡½®æ¡†æž¶çš?start level |
|
|
讄¡½® bundle çš?start level |
|
|
讄¡½®åˆå§‹åŒ?bundle çš?start level |
è‡Ïx¤åQŒæˆ‘们已¾læˆåŠŸçš„æ¼”ç¤ºäº†helloworldåQŒåˆæ¥äº†è§£äº†OSGiçš„bundle是如何开å‘åÆˆ˜q行的ã€?br />
补充资料åQ?br />
在Eclipse 里,当编辑器åQˆEditoråQ‰è¢«‹È€‹zÀL—¶åQŒå¤§¾U²è§†å›¾è‡ªåŠ¨é€šè¿‡˜q™ä¸ª¾~–辑器的getAdapter()æ–ÒŽ³•å¯ÀL‰¾å®ƒæä¾›çš„大纲åQˆå¤§¾U²å®žçްIcontentOutlinePage 接å£åQ‰ã€‚GEF æä¾›äº†ContentOutlinePage ¾cÈ”¨æ¥å®žçް大¾U²è§†å›¾ï¼Œæˆ‘们è¦åšçš„就是实çŽîC¸€ä¸ªå®ƒçš„å¾c»ï¼Œòq‰™‡ç‚¹å®žçްcreateControl()æ–ÒŽ³•。ContentOutlinePage 是org.eclipse.ui.part.Page 的一个å¾c»ï¼Œå¤§çº²è§†å›¾åˆ™æ˜¯PageBookView çš„å¾c»ï¼Œåœ¨å¤§¾U²è§†å›¾ä¸æœ‰ä¸€ä¸ªPageBookåQŒåŒ…å«äº†å¾ˆå¤šPage òq¶å¯ä»¥åœ¨å®ƒä»¬ä¹‹é—´åˆ‡æ¢åQŒåˆ‡æ¢çš„便®ž®±æ˜¯å½“剋zÕdŠ¨çš„Editorã€‚å› æ¤ï¼Œæˆ‘们在createControl()æ–ÒŽ³•里è¦åšçš„ž®±æ˜¯æž„é€ è¿™ä¸ªPageåQŒç®€åŒ–åŽçš„代ç 如下所½Cºï¼š
ç”׃ºŽæˆ‘ä»¬åœ¨æž„é€ æ–¹æ³•é‡ŒæŒ‡å®šäº†ä‹Éç”¨æ ‘¾l“构昄¡¤ºå¤§çº²åQŒæ‰€ä»¥createControl()里的½W¬ä¸€å¥å°±ä¼šä‹Éoutline å˜é‡å¾—到一个TreeåQˆè§org.eclipse.gef.ui.parts.TreeViewer 的代ç )åQŒç¬¬äºŒå¥æŠŠTreeViewer åŠ åˆ°é€‰æ‹©åŒæ¥å™¨ä¸åQŒä»Žè€Œè®©ç”¨æˆ·ä¸è®ºåœ¨å¤§¾U²æˆ–¾~–辑区域里选择EditPart æ—Óž¼Œå¦ä¸€æ–šwƒ½èƒ½è‡ªåЍåšå‡ºåŒæ ïLš„选择åQ›æœ€åŽä¸‰è¡Œçš„作用在以å‰çš„帖å里都有介¾l,æ€ÖM½“目的是把大纲视图的模型与¾~–辑区域的模型蔾pÕdœ¨ä¸€èµøP¼Œ˜q™æ ·åQŒå¯¹äºŽåŒä¸€ä¸ªæ¨¡åž‹æˆ‘们就有了两个视图åQŒä½“会到MVC 的好处了å§ã€?br /> 实现大纲视图最é‡è¦çš„工作基本就是这些,但还没有完,我们è¦åœ¨init()æ–ÒŽ³•里绑定UNDO/REDO/DELETE ½{‰å‘½ä»¤åˆ°Eclipse ä¸Èª—å£ï¼Œå¦åˆ™å½“大¾U²è§†å›‘Ö¤„äºŽæ´»åŠ¨çŠ¶æ€æ—¶åQŒä¸»å·¥å…·æ¡ä¸Šçš„这些命令就会å˜ä¸ÞZ¸å¯ç”¨çжæ€ï¼›åœ?getControl()æ–ÒŽ³•里覘q”回我们的outline æˆå‘˜å˜é‡åQŒä¹Ÿž®±æ˜¯æŒ‡å®šè®©è¿™ä¸ªæŽ§ä»¶å‡ºçŽ°åœ¨å¤§çº²è§†å›¾ä¸ï¼›åœ¨dispose()æ–ÒŽ³•里应该把˜q™ä¸ªTreeViewer ä»Žé€‰æ‹©åŒæ¥å™¨ä¸¿U»é™¤åQ›æœ€åŽï¼Œå¿…须在PracticeEditor 里覆盖getAdapter()æ–ÒŽ³•åQŒå‰é¢è¯´˜q‡ï¼Œ˜q™ä¸ªæ–ÒŽ³•是在Editor ‹È€‹zÀL—¶è¢«å¤§¾U²è§†å›¾è°ƒç”¨çš„åQŒæ‰€ä»¥åœ¨˜q™é‡Œå¿…须把我们实现好的OutlinePage ˜q”回¾l™å¤§¾U²è§†å›¾ä‹É用,代ç 如下åQ?/p>
è¦å®žçްåºåˆ—化åQŒåˆ™å¿…须实现serializable或Externalizable接å£ã€‚åŽè€…ç‘ô承自å‰è€…,两者的区别åQšå®žçްå‰è€…çš„¾cÕd¯ä»¥é‡‡ç”¨é»˜è®¤çš„åºåˆ—化方å¼ã€‚而实现åŽè€…çš„¾cÕdˆ™å®Œå…¨ç”Þp‡ªíw«æ¥æŽ§åˆ¶åºåˆ—åŒ–çš„è¡ŒäØ“ã€?br /> 在åºåˆ—化和ååºåˆ—化过½E‹ä¸éœ€è¦ç‰¹ŒDŠå¤„ç†çš„¾cÕd¿…™åÖM‹É用下列准¼‹®ç¾åæ¥å®žçްç‰Òޮп–ÒŽ³•åQ?/p>
如果Customer¾cÕd®žçŽîCº†Externalizable接å£åQŒé‚£ä¹ˆCustomer¾cÕd¿…™åÕd®žçްreadExternal
(ObjectInput in)å’ŒwriteExternal(ObjectOutput out)æ–ÒŽ³•。在˜q™ç§æƒ…况下,ž®†æŒ‰ç…§ä»¥ä¸‹æ–¹å¼åºåˆ—化åŠååºåˆ—化Customer对象åQ?/p>
ObjectOutputStreamåªèƒ½å¯¹å®žçŽîCº†Serializable接å£çš„类的对象进行åºåˆ—化。默认情况下åQŒObjectOutputStream按照默认方å¼åºåˆ—化,˜q™ç§åºåˆ—化方å¼ä»…仅对对象的éžtransient的实例å˜é‡è¿›è¡Œåºåˆ—化åQŒè€Œä¸ä¼šåºåˆ—化对象的transient的实例å˜é‡ï¼Œä¹Ÿä¸ä¼šåºåˆ—åŒ–é™æ€å˜é‡ã€?/p>
而当ObjectInputStream按照默认方å¼ååºåˆ—化æ—Óž¼Œæœ‰ä»¥ä¸‹ç‰¹ç‚¹ï¼š
被transient修饰½W¦æ¥ä¿®é¥°çš„实例å˜é‡æ˜¯ä¸ä¼šåºåˆ—化的åQŒä¸€èˆ¬ç”¨transientæ¥ä¿®é¥îC»¥ä¸‹ç±»åž‹çš„çš„å˜é‡ï¼š
åQ‘) 实例å˜é‡ä¸ä»£è¡¨å¯¹è±¡çš„固有的内部数æ®ï¼Œä»…仅代表å…ähœ‰ä¸€å®šé€»è¾‘å«ä¹‰çš„äÍæ—¶æ•°æ®ã€?br /> åQ’) 实例å˜é‡è¡¨ç¤ºä¸€äº›æ¯”è¾ƒæ•æ„Ÿçš„ä¿¡æ¯åQŒå¦‚密ç åQŒå‡ºäºŽå®‰å…¨æ–¹é¢çš„åŽŸå› åQŒä¸å¸Œæœ›å¯¹å…¶åºåˆ—化ã€?br /> åQ“) 实例å˜é‡éœ€è¦æŒ‰ç…§ç”¨æˆ¯‚‡ªå®šä¹‰çš„æ–¹å¼åºåˆ—化åQŒå¦‚¾lè¿‡åŠ å¯†åŽå†åºåˆ—化。这˜q™ç§æƒ…况下å¯ä»¥å°†å…¶ç”¨transient修饰åQŒç„¶åŽåœ¨writeObject()æ–ÒŽ³•ä¸å¯¹å…¶åºåˆ—化ã€?nbsp;
å‚è§SerializableDemoä¸çš„Customer2åŠOrder2¾cÖM¹‹é—´çš„关系ã€?br /> 当通过ObjectOutputStream对象的writeObject(customer)æ–ÒŽ³•åºåˆ—化Customer2对象æ—Óž¼Œä¹Ÿä¼šåºåˆ—化与它关è”çš„Order2对象。而当通过ObjectInputStream对象的readObject()æ–ÒŽ³•ååºåˆ—化Customer2对象æ—Óž¼Œå®žé™…上会å¯ÒŽ•´ä¸ªå¯¹è±¡å›¾ååºåˆ—化ã€?br /> 如果对象AæŒæœ‰å¯¹è±¡Bçš„å¼•ç”¨ï¼ˆæ³¨æ„æ˜¯AæŒæœ‰B的引用)åQŒä»¥åŠé—´æŽ¥æŒæœ‰å…¶ä»–对象的引用åQŒåˆ™æŒ‰ç…§é»˜è®¤æ–¹å¼åºåˆ—化对象Aæ—Óž¼Œä¼šå°†A以åŠAæŒæœ‰çš„以åŠé—´æŽ¥æŒæœ‰çš„æ‰€æœ‰å¯¹è±¡éƒ½åºåˆ—化。ååºåˆ—化也是如æ¤ã€?/p>
如果用户希望控制¾cÈš„åºåˆ—化方å¼ï¼Œå¯ä»¥åœ¨å¯åºåˆ—åŒ–ç±»ä¸æä¾›ä»¥ä¸‹åÅžå¼çš„writeObject()æ–ÒŽ³•å’ŒreadObject()æ–ÒŽ³•åQ?/p>
ä¸€èˆ¬çš„åšæ³•是,在writeObject()æ–ÒŽ³•ä¸ï¼Œé€‰ç•™éª¼ObjectOutputStreamçš„defaultWriteObject()æ–ÒŽ³•åQŒä‹É得对象输出æµå…ˆæ‰§è¡Œé»˜è®¤çš„åºåˆ—化æ“作ã€?br /> ååºåˆ—化æ—Óž¼Œåœ¨readObject()æ–ÒŽ³•ä¸ï¼Œå…ˆè°ƒç”¨ObjectInputStreamçš„defaultReadObject()æ–ÒŽ³•ã€?/p>
如果一个类æä¾›äº†readResolve()æ–ÒŽ³•åQŒé‚£ä¹ˆåœ¨æ‰§è¡Œååºåˆ—化æ“作æ—Óž¼Œå…ˆæŒ‰ç…§é»˜è®¤æ–¹å¼æˆ–者用戯‚‡ªå®šä¹‰çš„æ–¹å¼è¿›è¡Œååºåˆ—化,最åŽå†è°ƒç”¨readResolve()æ–ÒŽ³•åQŒè¯¥æ–ÒŽ³•˜q”å›žçš„å¯¹è±¡äØ“ååºåˆ—化的最¾lˆç»“æžœã€?br />
readResolve()æ–ÒŽ³•应该能够被类本èínã€åŒä¸€ä¸ªåŒ…ä¸çš„¾c»ï¼Œæˆ–è€…è®¿é—®ï¼Œå› æ¤readResolve()æ–ÒŽ³•的访问æƒé™å¯ä»¥æ˜¯pirvateã€é»˜è®¤æˆ–protected¾U§åˆ«ã€?br />
readResolve()æ–ÒŽ³•用æ¥é‡æ–°æŒ‡å®šååºåˆ—化得到的对象,与æ¤å¯¹åº”åQŒJavaåºåˆ—化规范还å…许在å¯åºåˆ—化类ä¸å®šä¹‰ä¸€ä¸ªwriteReplace()æ–ÒŽ³•åQŒç”¨æ¥é‡æ–°æŒ‡å®šè¢«åºåˆ—化的对象。writeReplace()æ–ÒŽ³•˜q”回一个Object¾cÕdž‹çš„对象,˜q™ä¸ª˜q”å›žå¯¹è±¡æ‰æ˜¯çœŸæ£è¦è¢«åºåˆ—化的对象。æƒé™ä¹Ÿå¯ä»¥ä¸ÞZ»¥ä¸Šä¸‰¿U之一ã€?nbsp;
Externallizable接壾l§æ‰¿è‡ªSerializable接å£åQŒå¦‚果一个类实现了Externalizable接å£åQŒé‚£ä¹ˆå°†å®Œå…¨ç”Þp¿™ä¸ªç±»æŽ§åˆ¶è‡ªèínçš„åºåˆ—åŒ–è¡ŒäØ“ã€‚Externalizable接å£ä¸å£°æ˜Žäº†ä¸¤ä¸ªæ–ÒŽ³•åQ?br />
writeExternalè´Ÿè´£åºåˆ—化æ“作,readExternalè´Ÿè´£ååºåˆ—化æ“作。在对实çŽîCº†Externallizable接å£çš„类的对象进行ååºåˆ—化时åQŒä¼šå…ˆè°ƒç”¨ç±»çš„ä¸å¸¦å‚æ•°çš„æž„é€ æ–¹æ³•ï¼Œ˜q™æ˜¯æœ‰åˆ«é»˜è®¤ååºåˆ—化方å¼çš„(è§ï¼’åQ‰ã€‚所以实现Externalizable接å£çš„ç±»å¿…é¡»è¦æœ‰ä¸å«å‚æ•°çš„æž„é€ æ–¹æ³•ã€?/p>
实例è§SerializableDemo里的Customer5的两个版本。将CustomeråQ?åQå’ŒSimpleServer攑֜¨server端,ž®†Customer2.0å’ŒSimpleClient攑֜¨Client端,直接˜q行åQŒå°†å‘现抛出错误åQŒæ˜¾½CÞZ¸å…¼å®¹åQŒè§£å†›_Šžæ³•æ˜¯æ‰‹åŠ¨ž®†ä¸¤ä¸ªCustomerçš„serialVersionUIDè®¾äØ“åŒä¸€ä¸ªå€û|¼Œ˜q™æ ·ž®Þpƒ½å…¼å®¹ã€‚但是这¿U办法的能力很有é™ï¼Œå½“一个类的ä¸åŒç‰ˆæœ¬çš„serialVersionUID相åŒåQŒä»ç„¶æœ‰å¯èƒ½å‡ºçްåºåˆ—化ä¸å…¼å®¹çš„æƒ…å†üc€‚å› ä¸ºåºåˆ—化兼容性ä¸ä»…å–决于serialVersionUIDåQŒè¿˜å–决于类的ä¸åŒç‰ˆæœ¬çš„实现¾l†èŠ‚å’Œåºåˆ—化¾l†èŠ‚ã€?/p>
估计大家å¯?/span>finalize()都有个基本的认识åQŒé‚£ž®±æ˜¯ä½œæ¸…ç†èµ„æºä¹‹ç”¨ã€‚比如在¾cÈš„æŸä¸ªæ–ÒŽ³•䏿‰“开了一个文ä»Óž¼Œé‚£ä¹ˆä½ å¯èƒ½éœ€è¦é€šè¿‡finalize()æ–ÒŽ³•æ¥é‡Šæ”¾è¯¥èµ„æºã€‚但是è¯è¯´å›žæ¥ï¼Œjava世界里,一切皆对象åQŒè€Œä“Q何一个å¦javaçš„äh都知é“,java对象是ä¸éœ€è¦æ‰‹åŠ¨åŽ»æ¸…ç†çš„ï¼Œå› äØ“java有强大的垃圾回收器,有ähå¯èƒ½ä¼šæœ‰ç–‘é—®åQŒé‚£æ—¢ç„¶å¦‚æ¤åQŒäؓ什么还需è¦åœ¨finalize()䏿‰‹åŠ¨é‡Šæ”¾èµ„æºå‘¢åQŸå½“ç„Óž¼Œé¢å¯¹˜q™ä¸€é—®é¢˜åQŒæœ‰å¾ˆå¥½çš„ç†ç”±åŽ»è§£é‡ŠåQŒå› 䏸™µ„æºæ˜¯æœ‰é™çš„,而我们åˆçŸ¥é“垃圾回收器的¾U¿ç¨‹ä¼˜å…ˆ¾U§éžå¸æ€½ŽåQŒåœ¨é€ég¸å¾—以的情况下åQŒå®ƒæ‰ä¼šå·¥ä½œåQŒä¹Ÿž®±æ˜¯è¯ß_¼Œåªè¦å†…嘑›_¤ŸåQŒå¤±æ•ˆçš„对象ž®×ƒ¸ä¼šè¢«æ¸…ç†åQŒå®ƒæ‰€æŒæœ‰çš„资æºä¹Ÿž®±å¾—ä¸åˆ°é‡Šæ”¾åQŒè€Œèµ„æºåˆæ˜¯æœ‰é™çš„åQŒæ¯”如数æ®åº“˜qžæŽ¥åQŒæ‰€ä»¥éœ€è¦æˆ‘们去手动释放。丘q‡è¿™ä¸€ç‚¹ï¼Œåœ?/span>JDK7里é¢ä¼ég¹Žæ˜¯æœ‰æ‰€å‘展åQŒå¬è¯´æ˜¯ä¼šè‡ªåŠ¨å®žçŽ°è¿™ä¸€ç‚¹ï¼Œä¹Ÿå°±æ˜¯è¯´åQ?/span>sunå¯èƒ½ä¸ºæˆ‘们åšäº†è¿™ä¸ªå·¥ä½œï¼Œä»¥åŽçš„程åºä¸å¯èƒ½ä¸éœ€è¦æ‰‹åŠ¨é‡Šæ”„¡±»ä¼¼æ•°æ®åº“资æºçš„代ç 了ã€?/span>
如果的确如æ¤åQŒé‚£æ˜¯ä¸æ˜¯æ„味ç€finalize()ž®±æ²¡ç”¨äº†å‘¢ï¼Ÿé”™ã€‚丘q?/span>finalize()¼‹®å®žç”¨åˆ°çš„æ—¶å€™ä¸ä¼šå¾ˆå¤šï¼Œå®ƒä¸»è¦ç”¨äºŽä¸€äº›æœ¬åœ°æ–¹æ³•调用过½E‹ä¸äº§ç”Ÿçš„èµ„æºæ¸…ç†ã€‚æ¯”å¦‚ä½ é€šè¿‡Native method调用cè¯è¨€çš?/span>mellocæ–ÒŽ³•分é…了一些内å˜ç©ºé—ß_¼Œè€Œè¿™éƒ¨åˆ†å†…å˜æ˜¯éœ€è¦?/span>cè¯è¨€çš?/span>free()æ¥è¿›è¡Œé‡Šæ”„¡š„åQŒå¦‚果丘q™æ ·åQŒå°±ä¼šäñ”ç”Ÿå†…å˜æ³„æ¼ï¼Œæ‰€ä»¥ä½ 需è¦åœ¨finalize()ä¸ç”¨Native methodæ–ÒŽ³•调用free()ž®†å…¶é‡Šæ”¾ã€?/span>
ä¸è¿‡è¯è¯´å›žæ¥åQ?/span>finalize()æ–ÒŽ³•òq¶ä¸å分ä¿é™©åQŒå› ä¸?/span>finalize()åªæœ‰åœ¨åžƒåœ‘Ö›žæ”¶å™¨å·¥ä½œçš„æ—¶å€™æ‰ä¼šè¢«è°ƒç”¨åQŒä¹Ÿž®±æ˜¯è¯ß_¼Œé€šè¿‡å®ƒè¿›è¡Œèµ„æºé‡Šæ”‘ÖÆˆä¸èƒ½¼‹®ä¿é©¬ä¸Šè¢«é‡Šæ”¾ï¼Œç”šè‡³å¯èƒ½æ ÒŽœ¬ä¸ä¼šè¢«é‡Šæ”¾ï¼ˆå› äØ“åžƒåœ¾å›žæ”¶å™¨å¯èƒ½ä¸ä¼šå·¥ä½œï¼‰åQŒå› æ¤ï¼Œèµ„æºé‡Šæ”¾ž®½é‡å¦æƒ³åŠžæ³•åQŒåˆ«å¤ªç›¸ä¿?/span>finalize()和垃圑֛žæ”¶å™¨äº†ã€?/span>
ç›®å‰åQ?/span>OSGiè§„èŒƒçš„æœ€æ–°ç‰ˆæœ¬äØ“R4.2åQŒæœ‰å…Œ™¯¥è§„范的详¾l†æƒ…况请阅读OSGi实战的第7节—â€?a href="/Files/benniaolk/OSGi/OSGiåˆè¯†/1.pdf">深入OSGiã€?/span>OSGi框架主è¦åˆ†äؓ四部分:˜q行环境åQ?/span>executionenvironmentåQ‰ã€æ¨¡å—(ModulesåQ‰ã€ç”Ÿå‘½å‘¨æœŸç®¡ç†ï¼ˆLife CycleåQ‰ã€æœåŠ¡æ³¨å†Œï¼ˆService RegistryåQ‰ã€‚è¿è¡Œåœ¨OSGi环境ä¸çš„æ˜¯ä¸€ä¸ªä¸ªçš?/span>BundleåQŒä¹Ÿž®±æ˜¯Modules的具体实现ã€?/span>
对于æ¯ä¸ªbundleåQŒéƒ½æœ‰å„自的ClassLoaderåQŒåœ¨˜q™ä¸€ç‚¹ä¸Šå’Œä¼ ¾lŸçš„Web应用有相ä¼ég¹‹å¤„ï¼Œåœ¨ä¼ ¾lŸçš„Web应用开å‘完æˆä¹‹åŽï¼Œéƒ½ä¼šž®†å…¶éƒ¨çÖvåœ?/span>Tomcatã€?/span>Jboss½{‰æœåŠ¡å™¨ä¸Šï¼Œ˜q™äº›Web应用都有ç€å„自çš?/span>ClassLoader环境åQŒè€Œä¸¤è€…之间的区别在于åQŒä¼ ¾lŸçš„Webåº”ç”¨æ— æ³•åšåˆ°èµ„æºçš„å…±äº«ï¼Œå› äØ“å®ƒä»¬æ˜¯å®Œå…¨ç‹¬ç«‹ã€éš”¼›Èš„ã€?/span>OSGi框架ä¸?/span>bundle之间的å作æä¾›äº†åº•层支æŒåQŒé€šè¿‡åœ?/span>bundleçš?/span>MANIFEST.MFæ–‡äšgä¸?/span>Import-Packageã€?/span>Export-Package½{‰é¡¹åQ?/span>bundle之间ž®Þpƒ½ç›æ€º’å…׃ín资æºåŠæœåŠ¡ï¼Œåœ¨ä»¥åŽçš„åšæ–‡ä¸ï¼Œæˆ‘å°†¾l™å‡ºä¸€ä¸ªå…·ä½“çš„½CÞZ¾‹ã€?/span>
ç”׃ºŽOSGiå…ähœ‰è‰¯å¥½çš„æ¨¡å—化¾l“æž„åQŒæˆ‘个ähè®¤äØ“˜q™å°†ä¸ºå°†æ¥çš„软äšg开呿–¹å¼å¸¦æ¥å¾ˆå¤§çš„冲击åQŒå°†æ›´è¿›ä¸€æ¥æŽ¨˜q›æ¨¡å—化开å‘。目å‰?/span>Web应用的开å‘一般采ç”?/span>SSH框架åQŒå°†æ•´ä¸ªåº”ç”¨å¤§è‡´åˆ†äØ“WebåQˆè´Ÿè´£å‰å°å±•玎ͼ‰ã€?/span>ServiceåQˆè´Ÿè´£ä¸šåŠ¡é€»è¾‘å¤„ç†åQ‰ã€?/span>DAOåQˆè´Ÿè´£æ•°æ®æŒä¹…化åQ‰ã€?/span>DomainåQˆå…¨å±€å®žä½“¾c»ï¼‰å‡ 个模å—åQŒè€Œå‘布的时候,ž®†è¢«ä¸€èµäh‰“æˆ?/span>WAR包,部çÖvè‡ÏxœåŠ¡å™¨ä¸Šã€‚å¦‚æžœé‡‡å?/span>bundleçš„åÅžå¼ï¼Œæ¯ä¸ªæ¨¡å—å¯ä»¥åšäؓ独立çš?/span>bundle˜q›è¡Œå¼€å‘和部çÖvåQ?/span>bundle之间的å作å¯ä»¥é€šè¿‡ä¸Šè¿°çš„æ–¹å¼è¿›è¡Œï¼Œè€Œè¿™æ ·å¸¦æ¥çš„好处ž®±æ˜¯åQŒä¸€æ—¦éœ€è¦å¯¹æŸä¸ªæ¨¡å—˜q›è¡Œæ›´æ”¹åQŒåœ¨ä¿è¯ä¾èµ–接å£ä¸å˜çš„剿䏋åQŒå°±å¯ä»¥å•独更改相应çš?/span>bundleåQŒå†˜q›è¡Œçƒéƒ¨¾|²å³å¯ï¼Œ˜q™æ ·ä¸€æ¥ï¼Œå¥½å¤„是显而易è§çš„åQŒæœ‰æ•ˆçš„分离了å„个模å—,å‡å°‘äº†ç»´æŠ¤æˆæœ¬ã€?/span>
ç”׃ºŽé‡‡ç”¨bundleçš„åÅžå¼ï¼Œä¹Ÿå¢žå¼ÞZº†æ¨¡å—çš„å¤ç”¨æ€§ã€‚这也是得益äº?/span>OSGi良好的模å—化方å¼ã€?/span>
å¦å¤–一个很é‡è¦çš„点ž®±æ˜¯OSGiå…·å¤‡çƒæ‹”æ’特性,bundle的安装ã€å¯åЍã€åœæ¢ã€å¸è½½éƒ½å¯ä»¥åœ¨è¿è¡Œæ—¶æŒ‡å®šåQŒåƈ且å¯ä»¥éšæ—¶æ›´æ”V€‚è¿™æ ·ä¸€æ¥ï¼Œæˆ‘们ž®±å¯ä»¥åšåˆ°æ— 需é‡å¯æ•´ä¸ªåº”用åQŒè€Œåªå¯šwœ€è¦æ›´æ”¹çš„部分˜q›è¡Œå‡çñ”或打补ä¸å›_¯ã€?/span>Bundl的状æ€å›¾è½¬æ¢å¦‚下图所½Cºï¼š
å›?/span> 1 OSGi bundle状æ€è{æ¢å›¾
以上ž®?/span>OSGi的一些基本的åQŒä½†ä¹Ÿæ˜¯å¾ˆé‡è¦çš„东西大概介ç»äº†ä¸€ä¸‹ï¼Œåœ¨ä»¥åŽçš„åšæ–‡ä¸é€æ¥æ·±å…¥å§ã€‚以上都是关äº?/span>OSGiåŽŸç†æ€§çš„东西åQŒé‚£ä¹ˆå®žçŽ°è¯¥è§„èŒƒçš„æœ‰å“ªäº›äº§å“呢?最有åçš„åº”è¯¥è¦æ•?/span>Eclipseçš?/span>Equinoxæ¡†æž¶äº†ï¼Œåœ¨ç½‘ä¸ŠæŸ¥èµ„æ–™è§æœ‰äºø™¯´˜q‡ï¼ŒEclipse3.0的那一‹Æ¡å‡¾U§æŠŠè‡ªèín的构架åšäº†ä¸€‹Æ¡éžå¸¸å¤§çš„è°ƒæ•ß_¼Œå…¶ä¸»è¦åŽŸå› å°±æ˜¯é‡‡ç”¨äº†OSGi框架åQŒæ›´å¥½çš„æ”¯æŒäº?/span>Eclipseçš„æ’件体¾p…R€‚å¦å¤–还æœ?/span>Felixã€?/span>knopflerfish½{‰ã€?/span>
ä¸è¿‡è¯è¯´å›žæ¥åQŒå°½½Ž?/span>OSGi有很多好处,但是现在主覘q˜æ˜¯åº”用在æœåŠ¡å™¨ç«¯ï¼Œå¦‚çŽ°åœ¨çš„åº”ç”¨æœåŠ¡å™¨åŸºæœ¬ä¸Šéƒ½é‡‡ç”?/span>OSGi的框æžÓž¼Œè€ŒçœŸæ£çš„应用市场ä»å¤„ç†è“væ¥é˜¶ŒDµï¼Œ˜q™å’ŒOSGi的生æ€çŽ¯å¢ƒè¿˜ä¸æˆç†Ÿï¼Œå¯å–œçš„æ˜¯Spring推出了其Spring DMå’?/span>SpringSource DM ServeråQŒå‰è€…能够很方便å‘布和引用æœåŠ¡ï¼Œòq¶ä¸”ä¸?/span>Spring Frameworkòq›_°ç›¸èžåˆï¼Œž®?/span>OSGiçš?/span>bundle contextä¸?/span>Spring applicationContextèžåˆåœ¨ä¸€èµøP¼Œå¤§å¤§æ–¹ä¾¿äº?/span>OSGi的应用。åŽè€…是OSGi bundleçš„è¿è¡ŒçŽ¯å¢ƒï¼Œæ˜¯ä¸€ä¸ªå°†Equinoxå’?/span>Tomcatèžåˆåœ¨ä¸€èµïLš„æœåŠ¡å™¨ã€‚åœ¨ä»¥åŽçš„åšæ–‡ä¸ž®†è¯¦¾l†ä»‹¾l这些内å®V€?/span>