锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 璇戣嚜錛?a >http://www.theserverside.com/blogs/showblog.tss?id=Unitized 鎶婁笂闈㈡彁鍒扮殑鑰冭檻鍦ㄤ竴璧鳳紝鎰忓懗鐫鍗曞厓嫻嬭瘯鏄祴璇曟暣涓唬鐮佷腑鏈浣庡眰嬈$殑閮ㄥ垎錛屾瘡涓涓儴鍒嗘槸鍜屽叾瀹冮儴鍒嗛殧紱葷殑銆傛祴璇曞拰緙栫爜鏄悓涓涓漢瀹屾垚鐨勩?br />榪欑鏂瑰紡鐨勬祴璇曟鏄滄垜鈥濇墍璇寸殑鈥渓ow hanging fruit鈥漑鍙交鏄撳疄鐜扮殑鐩爣 (easy targets)]銆傚畠鍙互鎹曡幏灝忕殑闂錛屼篃灝辨槸鍙互鎵懼埌涓嶇鍚堝崟鍏冩祴璇曠殑瑕佹眰鐨勫崟鐙殑鍑芥暟鎴栬呯被銆?/p> 鍗曞厓嫻嬭瘯鏄竴涓ソ浜嬶紝鎻愪緵浜嗗浜庤嚜宸變唬鐮佹紜х殑鏈変環鍊肩殑鍙嶉銆備絾鏄淜eep in mind" 瀹冨彧鑳藉緱鍒扳渓ow hanging fruit鈥濄傚湪璁捐涓婏紝鍗曞厓嫻嬭瘯琚湡鏈涒滅畝鍗曠殑鈥濄佲滀綔涓虹郴緇熶腑鐙珛鐨勫皬閮ㄥ垎鈥濄傚洜涓鴻繖浜涳紝鍦ㄥ畠鐨勬湰璐ㄤ笂錛堜笌鐢熶勘鏉ョ殑錛夛紝鍗曞厓嫻嬭瘯娌℃湁鑰冭檻緋葷粺鐨勨滅粍鍚堚濓紝瀹冨彧鑰冭檻鐙珛鐨勯儴鍒嗐傚崟鍏冩祴璇曚粠涓嶆鏌ヤ竴涓郴緇熶腑鍐呴儴鐨勮仈緇滐紝浠庝笉媯鏌ヤ粬浠槸濡備綍鎹嗙粦鍦ㄤ竴璧風殑銆?/p> 鏍規嵁鈥滄垜鈥濈殑緇忛獙錛岀郴緇熶腑濡備綍鑱旂粶鍜屽浣曟崋緇戝湪涓璧鋒鏄郴緇熺殑澶嶆潅搴︽墍鍦ㄣ?br />姝f槸榪欑鈥滆繛鎺モ濆畾涔変簡浣犵殑璁捐錛屽鏋滃湪涓涓凍澶熼珮鐨勫眰嬈′笂鑰冭檻錛岃繖縐嶈仈緋葷敋鑷沖彲浠ョ悊瑙d負緋葷粺鐨勬灦鏋勩?br />淇℃伅鏄浣曞湪涓嶅悓鐨勮蔣浠跺眰涓婂拰涓嶅悓鐨勭粍浠朵箣闂寸殑嫻佸姩瀹炲疄鍦ㄥ湪鐨勫畾涔変簡涓涓簲鐢ㄣ?br />鐢辨鐪嬫潵錛屽崟鍏冩祴璇曟槸涓嶄細嫻嬭瘯涓涓簲鐢ㄧ殑榪欎簺鏂歸潰鐨勩傚崟鍏冩祴璇曞拷鐣ヤ簡淇℃伅鏄浣曞湪涓嶅悓鐨勫眰鍜屼笉鍚岀殑緇勪歡涔嬮棿嫻佸姩鐨勶紝蹇界暐浜嗙被鍜屽璞″湪涓涓ぇ鐨勬灦鏋勫拰璁捐涓浣曠浉浜掑叧鑱斿拰緇勫悎鍦ㄤ竴璧風殑銆?br />榪欏氨鎰忓懗鐫鍗曞厓嫻嬭瘯鍙兘鍦ㄧ嫭绔嬬殑浠g爜鐗囨柇涓崟鑾風畝鍗曠殑閿欒錛屼絾鏄緋葷粺鐨勬暣浣撶殑璁捐鎴栬呮満鏋凷ay nothing銆?br />璁捐鍜屾灦鏋勯檺瀹氫簡浣犵殑緋葷粺鐨勬ц兘錛屽唴瀛樹嬌鐢紝鈥滅鍒扮鈥濈殑姝g‘鎬с俒鐢ㄦ埛鐨勮緭鍏ワ紝鍒癝erver澶勭悊鎵浣跨敤鐨勶紝鍒版渶鍚庣殑榪斿洖鐨勬暣涓礬寰刔銆傛墍浠ヨ繖浜涙槸濡備綍榪涜鑱旂郴鐨勬樉紺轟簡緋葷粺鐨勮涓猴紝騫朵笖姝f槸鍦ㄨ繖涓寖鍥翠腑瀛樺湪鐫the toughest bug 鍜?problems錛岃鎯寵涓鍒嘜K錛岀▼搴忓憳浠篃瑕佸湪榪欎釜鍦版柟鑻﹀共涓嶆銆?br />緙栧啓闅旂鐨勭嫭绔嬬粍浠舵槸瀹規槗鐨勶紝鎶婁粬浠矘鍚堝湪涓璧鋒槸鍥伴毦鐨勩傚崟鍏冩祴璇曞彧鍦ㄩ殧紱葷殑鍦ㄧ嫭绔嬬殑閮ㄥ垎涓婁綔鍒ゆ柇錛岃屼笉鏄湪鏁翠綋涓娿?/p> 浣跨郴緇熶腑鐨勪竴涓粍浠剁殑鍔ㄤ綔姝g‘鐩稿綋鏉ヨ鏄環鍊間笉楂樼殑媧誨姩銆傜嫭绔嬬殑緙栧啓涓涓郴緇熺殑緇勪歡涓嶆槸璁$畻鏈虹紪紼嬬殑鍥伴毦鐨勯儴鍒嗭紝浠諱綍涓涓釜浣撶殑灝忕殑緇勪歡閮芥槸瀹規槗緙栧啓鐨勩傚湪寮鍙戜腑鏈闅劇殑閮ㄥ垎鏉ヨ嚜浜庡浣曟妸鎵鏈夌殑緇勪歡鎹嗙粦鍦ㄤ竴璧峰伐浣溿傚崟鍏冩祴璇曞彲浠ラ獙璇佹瘡涓涓綘緙栧啓鐨勭嫭绔嬬粍浠舵槸涓嶆槸鎸夌収浣犳墍鎯崇殑閭f牱宸ヤ綔錛屼絾鏄畠涓嶈兘媯鏌ユ洿澶嶆潅鐨勨渨iring鈥?-鈥渨iring鈥濇鏄垜浠殑璁捐錛屽紑鍙戝拰璋冭瘯緇濆ぇ閮ㄥ垎宸ユ暟鎵鍦ㄣ?/p> 浠庝笂鐪嬫潵錛屽崟鍏冩祴璇曚笉浼氭寚鍑衡滅鍒扮鈥濈殑澶勭悊鏄惁姝e父錛屼笉浼氬叧蹇冩ц兘錛屼笉浼氬叧蹇冨唴瀛樼殑浣跨敤錛屼笉浼氬叧蹇冨彲鐢ㄦэ紝涓嶄細鍏沖績浠g爜鏄惁姝f槸鐢ㄦ埛鎯寵鐨勩傚畠涔熶笉浼氭崟鑾峰綰跨▼鐨刡ug錛屾垨鑰呴敊璇殑鐞嗚В浜嗗閮ˋPI鎴栬呭瓙緋葷粺鐨勪嬌鐢ㄧ瓑絳夈傝繖浜涘茍涓嶆剰鍛崇潃鍗曞厓嫻嬭瘯鏄笉濂界殑鎴栬呭簲璇ラ伩鍏嶇殑錛屽畠鍙槸璇存槑鍗曞厓嫻嬭瘯鍙細緇欎綘涓涓湁闄愮殑鍥炴姤銆傝鎯蟲垜浠綔涓哄紑鍙戜漢鍛橈紝鎴戜滑娌℃湁鏃犻檺鐨勮祫婧愬幓寮鍙戞垜浠殑浠g爜錛屾垜浠笉寰椾笉鑱槑鐨勫喅瀹氭垜浠鎶婃垜浠殑綺懼姏鏀懼湪閭i噷銆傛垜浠笉寰椾笉緇忓父鐨勬姌琛峰拰鍐沖畾鎬庢牱鍋氭湁鏈濂界殑鏁堟灉銆?/p> 鍦ㄢ滄垜鈥濆弬鍔犵殑鎵鏈夊紑鍙戜腑銆傚崟鍏冩祴璇曡鐩栦簡緇濆ぇ閮ㄥ垎鐨勪唬鐮侊紝浣嗘槸鍦ㄤ互涓嬬殑鏂歸潰鐨勫姫鍔涜繕宸緱寰堣繙錛?br />1銆傚簲鐢ㄧ▼搴忚璁$殑鏈韓銆備綘搴旇鑺辮垂鏇村鐨勬椂闂村湪浣犵殑璁捐涓婏紝閲囩敤涓縐嶈凱浠g殑錛岀湡瀹炲湴鏂瑰紡鑰屼笉鏄姳璐瑰湪鍗曞厓嫻嬭瘯涓婏紝鍥犱負涓涓ソ鐨勮璁″緱鍒扮殑鍥炴姤姣斾換浣曟暟閲忕殑鍗曞厓嫻嬭瘯閮藉銆?br />2銆傞泦鎴愭祴璇曪紙Integration Test錛夈傞泦鎴愭祴璇曠殑嫻嬭瘯鐗瑰緛鏄熀浜庘滅鍒扮鈥濈殑銆傞氳繃瀹冪殑璁捐鍙互璇佹槑浣犵殑鐙珛鐨勭粍浠跺彲浠ュ伐浣滃湪涓璧楓傞氳繃涓涓泦鎴愭祴璇曪紝浣犲彲浠ユ洿淇¤禆浣犵殑緋葷粺鎸夌収鈥滅鍒扮鈥濈殑鏂瑰紡宸ヤ綔錛岃屼笉鏄竴浜涚嫭绔嬬殑瀵硅薄銆?br />3銆傚姛鑳芥祴璇曞拰鍥炲綊嫻嬭瘯錛團unctional Test&Regression Test錛夈傜郴緇熶笉鏄紑鍙戜漢鍛樻兂鐨勯偅鏍鳳紝鑰屾槸鐢ㄦ埛鏈熸湜瀹冩槸浠涔堟牱瀛愩傛洿榪涗竴姝ワ紝鍥炲綊嫻嬭瘯褰撴柊鐨勭壒鎬ц榪藉姞鎴栬呭簳灞傜殑浠g爜琚敼鍙樻椂錛岄獙璇侀珮綰у埆鐨勫姛鑳界殑姝g‘鎬ф病鏈夎鏀瑰彉銆?br />4銆傞潪鍔熻兘嫻嬭瘯錛圢on-function Test)銆傚湪鍙帴鍙楃殑榪愯闇姹備笅錛屼唬鐮佷綔涓烘暣浣撹榪愯錛岃姹傚湪鍙帴鍙楃殑鏃墮棿鑼冨洿鍐呰澶勭悊銆俿ever涓嶄細鍥犱負鏈?涓敤鎴瘋姹傚氨浼歮emory绱у紶銆傜瓑絳夈?/p> 鍋氫互涓婄殑涓滆タ浼氭瘮鍗曞厓嫻嬭瘯闅懼緢澶氥備絾鏄湪鍚屾牱鐨勬姇鍏ヤ笅浼氬緱鍒版洿澶氱殑鍥炴姤銆?/p>
]]>
鑰冭檻涓涓嬪崟鍏冩祴璇曠殑鐩殑鍜屽師鍒欙細
1銆傚敖閲忓皬綺掑害鐨勨滃崟鍏冣濊嫻嬭瘯銆?br />2銆傛祴璇曞湪浜庡叾瀹冩ā鍧楅殧紱誨湴鎯呭喌涓嬬嫭绔嬪湴瀹屾垚銆?br />3銆侻ocking鍦ㄩ殧紱葷殑鏂歸潰浣滃嚭浜嗗己鍖栥?br />4銆備唬鐮佸拰嫻嬭瘯閮芥槸鍚屼竴涓漢瀹屾垚鐨勩?/p>
浠婂ぉ鍦ㄥ畬鎴愪竴涓姛鑳界殑鏃?/span>鍊欙紝浣跨敤浜?/span>ServiceLocate妯″紡錛?/span>
閫?/span>榪囪繖涓ā寮忥紝鍦ㄧ▼搴忎腑鍙互鑷敱鐨勫姞杞?/span>鍏朵粬鎴?/span>鍛樺疄鐜?/span>鐨勫姛鑳芥ā鍧?/span>
鍏蜂綋鐨勫仛娉曪細
1錛夊畾涔夋爣鍑嗙殑鏈?/span>鍔?/span>鎺ュ彛銆?/span>
2錛夊畾涔?/span>鎻忚堪瀹炵幇鏈?/span>鍔?/span>鎺ュ彛鐨?/span>xml鏂囦歡銆?/span>
3錛夌▼搴?/span>璇?/span>鍙?/span>璇?/span>xml鏂囦歡錛屼嬌鐢?/span>Class.newInstance()瀹?/span>渚嬪寲鍏蜂綋鐨勬湇鍔″璞°?/span>
4錛夊緩绔嬩竴涓壒瀹氭湇鍔?/span>鍜岀壒瀹氭湇鍔″疄鐜?/span>鐨?/span>瀵瑰簲鐨?/span>HashMap瀵?/span>璞°傚畬鎴愭敞鍐屼換鍔?/span>銆?/span>
5錛変富紼嬪簭涓牴鎹叿浣撶殑鏈?/span>鍔?/span>浠?/span>HashMap涓彇寰楀叿浣撶殑瀵?/span>璞?/span>榪?/span>琛屾湇鍔?/span>銆?/span>
榪?/span>涓柟娉?/span>榪?/span>涓?/span>閿?/span>錛屽彲浠ュ畬鎴愬熀浜?/span>Interface鐨?/span>寮鍙?/span>瑕佹眰錛屽埄浜?/span>Test鍜岀▼搴忕殑鎷撳睍鎬с?/span>
鏈夋柊鐨勮姹傚嚭鐜?/span>鍚庯紝鍙渶瑕佹坊鍔?/span>xml涓殑鍏冪礌鍜屽叿浣撶殑瀹炵幇綾?/span>灝卞彲浠ヤ簡銆?/span>
鎺ヤ笅鏉ワ紝緇х畫鎯熾傚張鍙戠幇浜?/span>涓浜?/span>闂錛?/span>
1錛?/span>xml鏄拰紼嬪簭涓璧?/span>鍙?/span>甯冪殑錛屽鏋滅敤鎴?/span>闅忔剰鏀?/span>鍔?/span>浜嗐傚緢鏄?/span>鏄?/span>紼嬪簭浼氬穿婧?/span>銆?/span>
瑙e喅鏂規硶錛?/span>xml鏀懼湪jar鍖呬腑錛屼嬌鐢?/span>getClass().getResourceAsStream(String name)
鑷繁鍔?/span>杞借繘鏉ャ傜敤鎴?/span>瀹屽叏涓嶇煡閬撳叿浣撶殑鎯呭喌銆?/span>
2錛夊鏋滄妸xml鏀懼湪浜?/span>jar鍖呬腑鈥滆棌璧鋒潵鈥濓紝瀹為檯涓婂師鏉?/span>甯?/span>鏉ョ殑鍔ㄦ佹墿灞曠殑鐗規э紝
涔熷氨娌℃湁閭?/span>涔?/span>鏄?/span>鏄?/span>浜嗐傚浣曡В鍐沖憿
緇嗙粏鎯蟲潵錛?/span>榪?/span>涓?/span>闂鐨?/span>鍏抽敭鍦ㄤ簬錛屾墍鏈夌殑鏈?/span>鍔″疄渚?/span>瀵?/span>璞$殑鍒?/span>寤哄拰娉ㄥ唽閮芥槸鍦?/span>
涓繪帶紼嬪簭涓?/span>榪?/span>xml鏉ュ畬鎴愮殑銆傚鏋滃彲浠ユ妸榪?/span>涓敞鍐屽拰瀹?/span>渚嬪寲鐨?/span>榪?/span>紼嬩粠涓繪帶紼嬪簭
涓垎紱誨嚭鏉ワ紝閫?/span>榪囨瘡涓湇鍔″疄渚?/span>瀵?/span>璞¤嚜鍔?/span>娉ㄥ唽鏉ュ畬鎴愶紝閭?/span>涔?/span>鎵?/span>綆楁槸鐪熸鐨勫彲鎷撳睍鐨勩?/span>
濡傛灉闇瑕佸畬鎴愭柊鐨勫姛鑳斤紝鍙渶瑕佹妸鏂扮殑鏈?/span>鍔″璞?/span>Class鍙?/span>甯冿紝閲嶆柊榪愯涓繪帶紼嬪簭灝變細瀹炵幇鏂?/span>鐨勫姛鑳姐傦紙鐪嬭搗鏉ュ氨鍜?/span>Eclipse涓鏍?/span>錛?/span>
榪?/span>鐪熸槸涓涓笉閿?/span>鐨勬兂娉曪紝浣嗘槸鎬?/span>涔?/span>鍋氬憿錛?/span>
鐪嬬湅Eclipse濡備綍鍋氱殑銆?/span>
http://www.eclipse.org/articles/Article-Plug-in-architecture/plugin_architecture.html
棣栧厛瑕佹湁涓涓?/span>瑙?/span>瀹氱殑plugin deploy鐩?/span>褰?/span>錛?/span>榪欐牱涓葷▼搴忔墠鐭ラ亾浠庡摢閲屽姞杞?/span>銆?/span>
瑕佹湁涓涓?/span>plugin.xml鏂囦歡鎻忚堪榪?/span>涓?/span>plugin.榪?/span>鐫鏂囦歡涓湁灞炴э細class="foo.bar.Plugin">
鐪嬩笂鍘誨拰鎴?/span>浠?/span>鍘熸潵鍋氱殑鏂瑰紡涓鏍?/span>鍟娿備絾鏄畠鏄浣曟妸榪?/span>涓洰褰?/span>涓嬬殑plugin閮藉姞杞?/span>鐨勫憿錛?/span>
錛?/span>鎴戞病鏈夌湅榪?/span>Eclipse鐨勬簮鐮?/span>錛屼笉鐭ラ亾浠栨槸鎬?/span>涔?/span>鍐欑殑錛?/span>
鍐嶆兂鎯籌紝鍏?/span>瀹?/span>涓昏瑕佽В鍐崇殑闂鏄笉閫?/span>榪?/span>涓繪鏋剁▼搴忔敞鍐屾湇鍔″疄鐜?/span>錛?/span>
搴旇鐢辨湇鍔?/span>紼嬪簭鑷繁娉ㄥ唽涓婃潵銆?/span>鎸夌収榪?/span>涓濊礬錛屾垜鎯蟲湁涓?/span>縐?/span>瑙e喅鏂規銆?/span>
1錛夋湇鍔?/span>鎺ュ彛娣誨姞registerService 鏂規硶銆?/span>
* 鍦?/span>jar鐨?/span>METATINFO鏂囦歡涓畾涔夌被鍚嶃?/span>
* 浠庣壒瀹氱殑鐩?/span>褰?/span>涓?/span>璇?/span>鍙?/span>jar/class鏂囦歡銆?/span>
* 閫?/span>榪?/span>URLClassLoader.newInstance()鍔?/span>杞?/span>
* 鍔?/span>杞?/span>鍚庢妸ServiceLoader浣?/span>涓?/span>鍙傛暟鍑哄叆 service.registerSevice()涓?/span>
* service瀵?/span>璞″畬鎴愯嚜宸辯殑娉ㄥ唽銆?/span>
2錛夋湇鍔?/span>娣誨姞static浠?/span>鐮?/span>绔湪綾?/span>琚?/span>瀹?/span>渚嬪寲鐨?/span>鏃?/span>鍊欒嚜鍔?/span>瀹屾垚娉ㄥ唽銆?/span>
* 鍔?/span>杞?/span>涔嬪墠鍜屼笂涓涓柟娉曚竴鏍?/span>銆?/span>
* 瀵?/span>SeviceLoader瀵?/span>璞?/span>瀹炵幇涓哄崟鎬?/span>鐨勬ā寮忋傛彁渚涢潤鎬?/span>鐨勬敞鍐屾柟娉曘?/span>
* 鍦?/span>servie瀵?/span>璞′腑瀹炵幇濡備笅鐨勪唬鐮?/span>孌靛畬鎴愯嚜鍔?/span>娉ㄥ唽銆?/span>
static
{
ServiceLoader.registerService(new service());
}
榪欐牱鐪嬫潵鎬葷畻OK浜嗗惂銆?/span>
鑷繁涓婇兘璐瑰姴銆傝漿鍒拌繖閲屼細濂戒竴浜涘惂錛?/p>
鍥炲ご鎶婁笢瑗塊兘鎼繃鏉ャ?/p>