鏈榪戠爺絀禨pring錛屽ス鍖呭惈鐨勭紪紼嬫濇兂璁╂垜鑰崇洰涓鏂般傛墍浠ュ啓涓嬭繖綃囧叆闂ㄧ駭鏂囩珷渚涙柊鎵嬪弬鑰冦傛垜涓嶆槸浠涔圫pring鐨勮祫娣辯爺絀朵漢鍛橈紝鎴戝彧鏄幇瀛︾幇鍗栥傛墍浠ユ枃绔犱篃鍙兘鏄偆嫻呭崟钖勶紝閿欒闅懼厤錛岃繕璇瘋璋呫?br />涓銆伮犅犅?Spring璇炵敓
Spring鏄竴涓紑婧愭鏋訛紝鐩墠鍦ㄥ紑婧愮ぞ鍖虹殑浜烘皵寰堟椇錛岃璁や負鏄渶鏈夊墠閫旂殑寮婧愭鏋朵箣涓銆傚ス鏄敱Rod Johnson鍒涘緩鐨勶紝濂圭殑璇炵敓鏄負浜嗙畝鍖栦紒涓氱駭緋葷粺鐨勫紑鍙戙傝閬揝pring灝變笉寰椾笉璇碋JB錛屽洜涓篠pring鍦ㄦ煇縐嶆剰涔変笂鏄疎JB鐨勬浛浠e搧錛屽ス鏄竴縐嶈交閲忕駭鐨勫鍣ㄣ傜敤榪嘐JB鐨勪漢閮界煡閬揈JB寰堝鏉傦紝涓轟簡涓涓畝鍗曠殑鍔熻兘浣犱笉寰椾笉緙栧啓澶氫釜Java鏂囦歡鍜岄儴緗叉枃浠訛紝浠栨槸涓縐嶉噸閲忕駭鐨勫鍣ㄣ備篃璁鎬綘涓嶄簡瑙JB錛屼綘鍙兘瀵光滆交錛堥噸錛夐噺綰р濆拰鈥滃鍣ㄢ濇瘮杈冮檶鐢燂紝閭d箞榪欓噷鎴戠畝鍗曚粙緇嶄竴涓嬨?br />1銆佷粈涔堟槸瀹瑰櫒
鈥滃鍣ㄢ濓紝榪欎釜姒傚康鍥版壈鎴戝ソ涔呫備粠瀛︿範Tomcat寮濮嬪氨涓鐩村姝ゆ劅鍒板洶鎯戙傛劅鎬х殑鏉ヨ錛屽鍣ㄥ氨鏄彲浠ョ敤鏉ヨ涓滆タ鐨勭墿鍝併傞偅涔堝湪緙栫▼棰嗗煙灝辨槸鎸囩敤鏉ヨ瀵硅薄錛圤O鐨勬濇兂錛屽鏋滀綘榪濷O閮戒笉浜嗚В錛屽緩璁綘鍘誨涔燨O鍏堬級鐨勫璞°傜劧鑰岃繖涓璞℃瘮杈冪壒鍒紝瀹冧笉浠呰瀹圭撼鍏朵粬瀵硅薄錛岃繕瑕佺淮鎶ゅ悇涓璞′箣闂寸殑鍏崇郴銆傝繖涔堣鍙兘榪樻槸澶娊璞★紝鏉ョ湅涓涓畝鍗曠殑渚嬪瓙錛?br />浠g爜鐗囨柇1錛?/font>
public class Container聽
{
聽聽聽 public void init()
聽聽聽 {
聽聽聽 Speaker s = new Speaker();
聽聽聽 Greeting g = new Greeting(s);
聽聽聽 }
}
鍙互鐪嬪埌榪欓噷鐨凜ontainer綾伙紙瀹瑰櫒錛夊湪鍒濆鍖栫殑鏃跺欎細鐢熸垚涓涓猄peaker瀵硅薄鍜屼竴涓狦reeting瀵硅薄錛屽茍涓旂淮鎸佷簡瀹冧滑鐨勫叧緋伙紝褰撶郴緇熻鐢ㄨ繖浜涘璞$殑鏃跺欙紝鐩存帴闂鍣ㄨ灝卞彲浠ヤ簡銆傝繖灝辨槸瀹瑰櫒鏈鍩烘湰鐨勫姛鑳斤紝緇存姢緋葷粺涓殑瀹炰緥錛堝璞★級銆傚鏋滃埌榪欓噷浣犺繕鏄劅鍒版ā緋婄殑璇濓紝鍒媴蹇冿紝鎴戝悗闈㈣繕浼氭湁鐩稿叧鐨勮В閲娿?/font>
2銆佽交閲忕駭涓庨噸閲忕駭
鎵璋撯滈噸閲忕駭鈥濇槸鐩稿浜庘滆交閲忕駭鈥濇潵璁茬殑錛屼篃鍙互璇粹滆交閲忕駭鈥濇槸鐩稿浜庨噸閲忕駭鏉ヨ鐨勩傚湪Spring鍑虹幇涔嬪墠錛屼紒涓氱駭寮鍙戜竴鑸兘閲囩敤EJB錛屽洜涓哄畠鎻愪緵鐨勪簨鍔$鐞嗭紝澹版槑寮忎簨鍔℃敮鎸侊紝鎸佷箙鍖栵紝鍒嗗竷璁$畻絳夌瓑閮解滅畝鍖栤濅簡浼佷笟綰у簲鐢ㄧ殑寮鍙戙傛垜榪欓噷鐨勨滅畝鍖栤濇墦浜嗗弻寮曞彿錛屽洜涓鴻繖鏄浉瀵圭殑銆傞噸閲忕駭瀹瑰櫒鏄竴縐嶅叆渚靛紡鐨勶紝涔熷氨鏄浣犺鐢‥JB鎻愪緵鐨勫姛鑳藉氨蹇呴』鍦ㄤ綘鐨勪唬鐮佷腑浣撶幇鍑烘潵浣犱嬌鐢ㄧ殑鏄疎JB錛屾瘮濡傜戶鎵夸竴涓帴鍙o紝澹版槑涓涓垚鍛樺彉閲忋傝繖鏍峰氨鎶婁綘鐨勪唬鐮佺粦瀹氬湪EJB鎶鏈笂浜嗭紝鑰屼笖EJB闇瑕丣BOSS榪欐牱鐨勫鍣ㄦ敮鎸侊紝鎵浠ョО涔嬩負鈥滈噸閲忕駭鈥濄?br />鐩稿鑰岃█鈥滆交閲忕駭鈥濆氨鏄潪鍏ヤ鏡寮忕殑錛岀敤Spring寮鍙戠殑緋葷粺涓殑綾諱笉闇瑕佷緷璧朣pring涓殑綾伙紝涓嶉渶瑕佸鍣ㄦ敮鎸侊紙褰撶劧Spring鏈韓鏄竴涓鍣級錛岃屼笖Spring鐨勫ぇ灝忓拰榪愯寮鏀兘寰堝井閲忋備竴鑸潵璇達紝濡傛灉緋葷粺涓嶉渶瑕佸垎甯冭綆楁垨鑰呭0鏄庡紡浜嬪姟鏀寔閭d箞Spring鏄竴涓洿濂界殑閫夋嫨銆?/font>
浜屻伮犅犅?鍑犱釜鏍稿績姒傚康
鍦ㄦ垜鐪嬫潵Spring鐨勬牳蹇冨氨鏄袱涓蹇碉紝鍙嶅悜鎺у埗錛圛oC錛夛紝闈㈠悜鍒囬潰緙栫▼錛圓OP錛夈傝繕鏈変竴涓浉鍏崇殑姒傚康鏄疨OJO錛屾垜涔熶細鐣ュ甫浠嬬粛銆?br />1銆丳OJO
鎴戞墍鐪嬪埌榪囩殑POJO鍏ㄧО鏈変袱涓紝Plain Ordinary Java Object錛孭lain Old Java Object錛屼袱涓樊涓嶅錛屾剰鎬濋兘鏄櫘閫氱殑Java綾伙紝鎵浠ヤ篃涓嶇敤鍘葷璋佸璋侀敊銆侾OJO鍙互鐪嬪仛鏄畝鍗曠殑JavaBean錛堝叿鏈変竴緋誨垪Getter錛孲etter鏂規硶鐨勭被錛夈備弗鏍煎尯鍒嗚繖閲岄潰鐨勬蹇墊病鏈夊お澶ф剰涔夛紝浜嗚В涓涓嬪氨琛屻?br />2銆伮犅犅?IoC
IoC鐨勫叏縐版槸Inversion of Control錛屼腑鏂囩炕璇戝弽鍚戞帶鍒舵垨鑰呴嗗悜鎺у埗銆傝繖閲岀殑鍙嶅悜鏄浉瀵笶JB鏉ヨ鐨勩侲JB浣跨敤JNDI鏉ユ煡鎵鵑渶瑕佺殑瀵硅薄錛屾槸涓誨姩鐨勶紝鑰孲pring鏄妸渚濊禆鐨勫璞℃敞鍏ョ粰鐩稿簲鐨勭被錛堣繖閲屾秹鍙婂埌鍙﹀涓涓蹇碘滀緷璧栨敞鍏モ濓紝紼嶅悗瑙i噴錛夛紝鏄鍔ㄧ殑錛屾墍浠ョО涔嬩負鈥滃弽鍚戔濄傚厛鐪嬩竴孌典唬鐮侊紝榪欓噷鐨勫尯鍒氨寰堝鏄撶悊瑙d簡銆?br />浠g爜鐗囨2錛?/font>
public void greet()
{
Speaker s = new Speaker();
s.sayHello();
}
浠g爜鐗囨3錛?/font>
public void greet()
{
Speaker s = (Speaker)context.lookup("ejb/Speaker");
s.sayHello();
}
浠g爜鐗囨4錛?/font>
public class Greeting聽
{
聽聽聽 public Speaker s;
聽聽聽 public Greeting(Speaker s)
聽聽聽 {
聽聽聽聽聽聽聽 this.s = s;
聽聽聽 }
聽聽聽 public void greet()
聽聽聽 {
聽聽聽聽聽聽聽 s.sayHello();
聽聽聽 }
}
鎴戜滑鍙互瀵規瘮涓涓嬭繖涓夋浠g爜銆傚叾涓墖孌?鏄笉鐢ㄥ鍣ㄧ殑緙栫爜錛岀墖孌?鏄疎JB緙栫爜錛岀墖孌?鏄疭pring緙栫爜銆傜粨鍚堜唬鐮佺墖孌?錛屼綘鑳界湅鍑烘潵Spring緙栫爜鐨勪紭瓚婁箣澶勫悧錛熶篃璁鎬綘浼氳寰桽pring鐨勭紪鐮佹槸鏈澶嶆潅鐨勩備笉榪囨病鍏崇郴錛屾垜鍦ㄥ悗闈細瑙i噴Spring緙栫爜鐨勫ソ澶勩?br />榪欓噷鎴戞兂鍏堣В閲婁竴涓嬧滀緷璧栨敞鍏モ濄傛牴鎹垜緇欑殑渚嬪瓙鍙互鐪嬪嚭錛孏reeting綾諱緷璧朣peaker綾匯傜墖孌?鍜岀墖孌?閮芥槸涓誨姩鐨勫幓鑾峰彇Speaker錛岃櫧鐒惰幏鍙栫殑鏂瑰紡涓嶅悓銆備絾鏄墖孌?騫舵病鏈夊幓鑾峰彇鎴栬呭疄渚嬪寲Speaker綾伙紝鑰屾槸鍦╣reeting鍑芥暟涓洿鎺ヤ嬌鐢ㄤ簡s銆備綘涔熻寰堝鏄撳氨鍙戠幇浜嗭紝鍦ㄦ瀯閫犲嚱鏁頒腑鏈変竴涓猻琚敞鍏ワ紙鍙兘浣犲鉤鏃剁敤鐨勬槸錛屼紶鍏ワ級銆傚湪鍝噷娉ㄥ叆鐨勫憿錛熻鍥炲ご鐪嬩竴涓嬩唬鐮佺墖孌?錛岃繖灝辨槸浣跨敤瀹瑰櫒鐨勫ソ澶勶紝鐢卞鍣ㄦ潵緇存姢鍚勪釜綾諱箣闂寸殑渚濊禆鍏崇郴錛堜竴鑸氳繃Setter鏉ユ敞鍏ヤ緷璧栵紝鑰屼笉鏄瀯閫犲嚱鏁幫紝鎴戣繖閲屾槸涓轟簡綆鍖栫ず渚嬩唬鐮侊級銆侴reeting騫朵笉闇瑕佸叧蹇僑peaker鏄摢閲屾潵鐨勬垨鏄粠鍝噷鑾峰緱Speaker錛屽彧闇瑕佸叧娉ㄨ嚜宸卞垎鍐呯殑浜嬫儏錛屼篃灝辨槸璁㏒peaker璇翠竴鍙ラ棶鍊欑殑璇濄?br />3銆伮犅犅?AOP
AOP鍏ㄧО鏄疉spect-Oriented Programming錛屼腑鏂囩炕璇戞槸闈㈠悜鏂歸潰鐨勭紪紼嬫垨鑰呴潰鍚戝垏闈㈢殑緙栫▼銆備綘搴旇鐔熸倝闈㈠悜榪囩▼鐨勭紪紼嬶紝闈㈠悜瀵硅薄鐨勭紪紼嬶紝浣嗘槸闈㈠悜鍒囬潰鐨勭紪紼嬩綘涔熻鏄涓嬈″惉璇淬傚叾瀹炶繖浜涙蹇靛惉璧鋒潵寰堢巹錛岃鍒板簳涔熷氨鏄竴鍙ヨ瘽鐨勪簨鎯呫?br />鐜板湪鐨勭郴緇熷線寰寮鴻皟鍑忓皬妯″潡涔嬮棿鐨勮﹀悎搴︼紝AOP鎶鏈氨鏄敤鏉ュ府鍔╁疄鐜拌繖涓鐩爣鐨勩備婦渚嬫潵璇達紝鍋囧涓婃枃鐨凣reeting緋葷粺鍚湁鏃ュ織妯″潡錛屽畨鍏ㄦā鍧楋紝浜嬪姟綆$悊妯″潡錛岄偅涔堟瘡涓嬈reet鐨勬椂鍊欙紝閮戒細鏈夎繖涓変釜妯″潡鍙備笌錛屼互鏃ュ織妯″潡涓轟緥錛屾瘡嬈reet涔嬪悗錛岄兘瑕佽褰曚笅greet鐨勫唴瀹廣傝屽浜嶴peaker鎴栬匞reeting瀵硅薄鏉ヨ錛屽畠浠茍涓嶇煡閬撹嚜宸辯殑琛屼負琚褰曚笅鏉ヤ簡錛屽畠浠繕鏄儚浠ュ墠涓鏍風殑宸ヤ綔錛屽茍娌℃湁浠諱綍鍖哄埆銆傚彧鏄鍣ㄦ帶鍒朵簡鏃ュ織琛屼負銆傚鏋滆繖閲屼綘鏈夌偣緋婃秱錛屾病鍏崇郴錛岀瓑璁插埌鍏蜂綋Spring閰嶇疆鍜屽疄鐜扮殑鏃跺欎綘灝辨槑鐧戒簡銆?br />鍋囧鎴戜滑鐜板湪涓篏reeting緋葷粺鍔犲叆涓涓猇alediction鍔熻兘錛岄偅涔圓OP妯″紡鐨勭郴緇熺粨鏋勫涓嬶細
G|RET|TIN|G
V|ALE|DIT|ION
|聽聽 |聽聽 |
鏃ュ織 瀹夊叏 浜嬪姟
榪欎簺妯″潡鏄瘡絀垮湪鏁翠釜緋葷粺涓殑錛屼負緋葷粺鐨勪笉鍚岀殑鍔熻兘鎻愪緵鏈嶅姟錛屽彲浠ョО姣忎釜妯″潡鏄竴涓滃垏闈⑩濄傚叾瀹炩滃垏闈⑩濇槸涓縐嶆娊璞★紝鎶婄郴緇熶笉鍚岄儴鍒嗙殑鍏叡琛屼負鎶藉彇鍑烘潵褰㈡垚涓涓嫭绔嬬殑妯″潡錛屽茍涓斿湪閫傚綋鐨勫湴鏂癸紙涔熷氨鏄垏鍏ョ偣錛屽悗鏂囦細瑙i噴錛夋妸榪欎簺琚娊鍙栧嚭鏉ョ殑鍔熻兘鍐嶆彃鍏ョ郴緇熺殑涓嶅悓閮ㄥ垎銆?br />浠庢煇縐嶈搴︿笂鏉ヨ鈥滃垏闈⑩濇槸涓涓潪甯稿艦璞$殑鎻忚堪錛屽畠濂藉儚鍦ㄧ郴緇熺殑鍔熻兘涔嬩笂妯垏涓鍒錛岃鎯寵緋葷粺鐨勫姛鑳界戶緇紝灝卞繀欏誨厛榪囦簡榪欎釜鍒囬潰銆傝繖浜涘垏闈㈢洃瑙嗗茍鎷︽埅緋葷粺鐨勮涓猴紝鍦ㄦ煇浜涳紙琚寚瀹氱殑錛夎涓烘墽琛屼箣鍓嶆垨涔嬪悗鎵ц涓浜涢檮鍔犵殑浠誨姟錛堟瘮濡傝褰曟棩蹇楋級銆傝岀郴緇熺殑鍔熻兘嫻佺▼錛堟瘮濡侴reeting錛夊茍涓嶇煡閬撹繖浜涘垏闈㈢殑瀛樺湪錛屾洿涓嶄緷璧栦簬榪欎簺鍒囬潰錛岃繖鏍峰氨闄嶄綆浜嗙郴緇熸ā鍧椾箣闂寸殑鑰﹀悎搴︺?/font>
涓夈伮犅犅?Spring鍒濅綋楠?br />榪欎竴鑺傛垜鐢ㄤ竴涓叿浣撶殑渚嬪瓙Greeting錛屾潵璇存槑浣跨敤Spring寮鍙戠殑涓鑸祦紼嬪拰鏂規硶錛屼互鍙奡pring閰嶇疆鏂囦歡鐨勫啓娉曘?br />棣栧厛鍒涘緩涓涓猄peaker綾伙紝浣犲彲浠ユ妸榪欎釜綾葷湅鍋氭槸POJO銆?br />浠g爜鐗囨5錛?/font>
public class Speaker聽
{
聽聽聽 public void sayHello()
聽聽聽 {
聽聽聽聽聽聽聽 System.out.println("Hello!");
聽聽聽 }
}
鍐嶅垱寤轟竴涓狦reeting綾匯?br />浠g爜鐗囨6錛?/font>
public class Greeting聽
{
聽聽聽 private Speaker speaker;
聽聽聽 public void setSpeaker(Speaker speaker)
聽聽聽 {
聽聽聽聽聽聽聽 this.speaker = speaker;
聽聽聽 }
聽聽聽 public void greet()
聽聽聽 {
聽聽聽聽聽聽聽 speaker.sayHello();
聽聽聽 }
}
鐒跺悗瑕佸垱寤轟竴涓猄pring鐨勯厤緗枃浠舵妸榪欎袱涓被鍏寵仈璧鋒潵銆?br />浠g爜鐗囨7錛坅pplicationContext.xml錛夛細
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"聽
聽聽聽 "
http://www.springframework.org/dtd/spring-beans.dtd
">
<beans>
聽聽聽 <bean id="Speaker" class="Speaker"></bean>
聽聽聽 <bean id="Greeting" class="Greeting">
聽聽聽聽聽聽聽 <property name="speaker">
聽聽聽聽聽聽聽聽聽聽聽 <ref bean="Speaker"/>
聽聽聽聽聽聽聽 </property>
聽聽聽 </bean>
</beans>
瑕佺敤Spring Framework蹇呴』鎶奡pring鐨勫寘鍔犲叆鍒癈lasspath涓紝鎴戠敤鐨勬槸Eclipse+MyEclipse錛岃繖浜涘伐浣滄槸鑷姩瀹屾垚鐨勩傛帹鑽愮敤Spring鐨勯厤緗枃浠剁紪杈戝櫒鏉ョ紪杈戯紝綰墜宸ョ紪鍐欏緢瀹規槗鍑洪敊銆傛垜鍏堝垎鏋愪竴涓嬭繖涓獂ml鏂囦歡鐨勭粨鏋勶紝鐒跺悗鍐嶅仛嫻嬭瘯銆備粠<beans>鑺傜偣寮濮嬶紝鍏堝0鏄庝簡涓や釜<bean>錛岀浜屼釜bean鏈変竴涓猻peaker灞炴э紙property錛夎姹傝娉ㄥ叆錛屾敞鍏ョ殑鍐呭鏄彟澶栦竴涓猙ean Speaker銆傝繖閲岀殑鍛藉悕鏄鍚圝avaBean瑙勮寖鐨勶紝涔熷氨鏄濡傛灉鏄痵peaker灞炴э紝閭d箞Spring瀹瑰櫒灝變細璋冪敤setSpeaker()鏉ユ敞鍏ヨ繖涓睘鎬с?lt;ref>鏄痳eference鐨勬剰鎬濓紝琛ㄧず寮曠敤鍙﹀涓涓猙ean銆?br />涓嬮潰鐪嬩竴孌電畝鍗曠殑嫻嬭瘯浠g爜錛?br />浠g爜鐗囨8錛?/font>
public static void main(String[] args)聽
{
聽聽聽聽聽聽聽 ApplicationContext context =聽
聽聽聽聽聽聽聽聽聽聽聽 New ClassPathXmlApplicationContext("applicationContext.xml");
聽聽聽聽聽聽聽 Greeting greeting = (Greeting)context.getBean("Greeting");
聽聽聽聽聽聽聽 greeting.greet();
}
榪欐浠g爜寰堢畝鍗曪紝濡傛灉浣犱笂鏂囬兘鐪嬫噦浜嗭紝閭d箞榪欓噷搴旇娌℃湁闂銆傚煎緱娉ㄦ剰鐨勬槸Spring鏈変袱縐嶆柟寮忔潵鍒涘緩瀹瑰櫒錛堟垜浠笉鍐嶇敤涓婃枃鎴戜滑鑷繁緙栧啓鐨凜ontainer錛夛紝涓縐嶆槸ApplicationContext錛屽彟澶栦竴縐嶆槸BeanFactory銆侫pplicationContext鏇村己澶т竴浜涳紝鑰屼笖浣跨敤涓婁袱鑰呮病鏈夊お澶у尯鍒紝鎵浠ヤ竴鑸鏉ラ兘鐢ˋpplicationContext銆係pring瀹瑰櫒甯姪鎴戜滑緇存姢鎴戜滑鍦ㄩ厤緗枃浠朵腑澹版槑鐨凚ean浠ュ強瀹冧滑涔嬮棿鐨勪緷璧栧叧緋伙紝鎴戜滑鐨凚ean鍙渶瑕佸叧娉ㄨ嚜宸辯殑鏍稿績涓氬姟銆?/font>
鍥涖伮犅犅?闈㈠悜鎺ュ彛鐨勭紪紼?br />鐪嬩簡榪欎箞澶氾紝涔熻浣犲茍娌℃湁瑙夊緱Spring緇欏紑鍙戝甫鏉ヤ簡寰堝渚垮埄銆傞偅鏄洜涓烘垜涓劇殑渚嬪瓙榪樹笉鑳界獊鍑篠pring鐨勪紭瓚婁箣澶勶紝鎺ヤ笅鏉ユ垜灝嗛氳繃鎺ュ彛緙栫▼鏉ヤ綋鐜癝pring鐨勫己澶с?br />鍋囧鐜板湪瑕佹眰鎵╁睍Greeting鐨勫姛鑳斤紝瑕佽Speaker鐢ㄤ笉鍚岀殑璇█鏉ラ棶鍊欙紝涔熷氨鏄鏈変笉鍚岀殑Speaker錛屾瘮濡侰hineseSpeaker, EnglishSpeaker銆傞偅涔堝涓婃枃鎻愬埌鐨勪笁縐嶇紪鐮佹柟寮忥紙浠g爜鐗囨2銆?銆?錛夊垎鍒姞浠ヤ慨鏀癸紝浣犱細鍙戠幇寰堥夯鐑︺傚亣濡備笅嬈″張瑕佸姞鍏ヤ竴涓タ鐝墮璇紝鍙堝緱閲嶅鍔沖姩銆傚緢鑷劧鐨勪細鑰冭檻鍒頒嬌鐢ㄤ竴涓狪Speaker鎺ュ彛鏉ョ畝鍖栧伐浣?錛屾洿鏀瑰悗鐨勪唬鐮佸涓嬶紙榪欓噷娌℃湁鍒楀嚭鎺ュ彛鐨勭浉鍏充唬鐮侊紝鎴戞兂浣犲簲璇ユ槑鐧芥庝箞鍐欙級錛毬犅犅犅犅犅犅犅?
浠g爜鐗囨9錛?/font>
public void greet()
{
ISpeaker s = new ChineseSpeaker();
s.sayHello();
}
浠g爜鐗囨10錛?/font>
public void greet()
{
ISpeaker s = (ISpeaker)context.lookup("ejb/ChineseSpeaker");
s.sayHello();
}
浠g爜鐗囨11錛?/font>
public class Greeting聽
{
聽聽聽 public ISpeaker s;
聽聽聽 public Greet(ISpeaker s)
聽聽聽 {
聽聽聽聽聽聽聽 this.s = s;
聽聽聽 }
聽聽聽 public void greet()
聽聽聽 {
聽聽聽聽聽聽聽 s.sayHello();
聽聽聽 }
}
瀵規瘮涓夋浠g爜錛屼綘浼氬彂鐜幫紝絎竴縐嶆柟娉曡繕鏄妸鍏蜂綋鐨凷peaker紜紪鐮佸埌浠g爜涓簡錛岀浜屼腑鏂規硶紼嶅井濂戒竴鐐癸紝浣嗘槸娌℃湁鏈川鏀瑰彉錛岃岀涓夌鏂規硶灝變笉涓鏍蜂簡錛屼唬鐮佷腑騫舵病鏈夊叧浜庡叿浣揝peaker鐨勪俊鎭備篃灝辨槸璇達紝濡傛灉涓嬫榪樻湁浠涔堟敼鍔ㄧ殑璇濓紝絎笁縐嶆柟娉曠殑Greeting綾繪槸涓嶉渶瑕佷慨鏀癸紝緙栬瘧鐨勩傛牴鎹笂鏂嘢pring鐨勪嬌鐢ㄤ粙緇嶏紝鍙渶瑕佹敼鍔▁ml鏂囦歡灝辮兘緇橤reeting娉ㄥ叆涓嶅悓鐨凷peaker浜嗭紝榪欐牱浠g爜鐨勬墿灞曟ф槸涓嶆槸鎻愰珮浜嗗緢澶氾紵
鍏充簬Spring鐨勬帴鍙g紪紼嬭繕鏈夊緢澶氫笢瑗垮彲浠ュ幓鎸栨帢錛屽悗鏂囪繕浼氭彁鍒版湁鍏砈pring Proxy鐨勬帴鍙g紪紼嬶紝鎴戣繖閲屽厛浠嬬粛榪欎箞澶氾紝鏈夊叴瓚h瘽鍙互鍘籫oogle鏇村鐨勮祫鏂欍?/font>
浜斻伮犅犅?搴旂敤Spring涓殑鍒囬潰
Spring鐢熸潵鏀寔AOP錛岄鍏堟潵鐪嬪嚑涓蹇碉細
1銆伮犅犅?鍒囬潰錛圓spect錛夛細鍒囬潰鏄郴緇熶腑鎶借薄鍑烘潵鐨勭殑鏌愪竴涓姛鑳芥ā鍧楋紝涓婃枃宸茬粡鏈夎繃浠嬬粛錛岃繖閲屼笉鍐嶅璇淬?br />2銆伮犅犅?閫氱煡錛圓dvice錛夛細閫氱煡鏄垏闈㈢殑鍏蜂綋瀹炵幇銆備篃灝辨槸璇翠綘鐨勫垏闈㈣瀹屾垚浠涔堝姛鑳斤紝鍏蜂綋鎬庝箞鍋氬氨鏄湪閫氱煡閲岄潰瀹屾垚鐨勩傝繖涓悕縐頒技涔庢湁鐐硅浜鴻垂瑙o紝絳夊悗闈㈢湅浜嗕唬鐮佸氨鏄庣櫧浜嗐?br />3銆伮犅犅?鍒囧叆鐐癸紙Pointcut錛夛細鍒囧叆鐐瑰畾涔変簡閫氱煡搴旇搴旂敤鍒扮郴緇熺殑鍝簺鍦版柟銆係pring鍙兘鎺у埗鍒版柟娉曪紙鏈夌殑AOP妗嗘灦鍙互鎺у埗鍒板睘鎬э級錛屼篃灝辨槸璇翠綘鑳藉湪鏂規硶璋冪敤涔嬪墠鎴栬呬箣鍚庨夋嫨鍒囧叆錛屾墽琛岄澶栫殑鎿嶄綔銆?br />4銆伮犅犅?鐩爣瀵硅薄錛圱arget錛夛細鐩爣瀵硅薄鏄閫氱煡鐨勫璞°傚畠鍙互鏄換浣曠被錛屽寘鎷綘鑷繁緙栧啓鐨勬垨鑰呯涓夋柟綾匯傛湁浜咥OP浠ュ悗錛岀洰鏍囧璞″氨鍙渶瑕佸叧娉ㄨ嚜宸辯殑鏍稿績涓氬姟錛屽叾浠栫殑鍔熻兘錛屾瘮濡傛棩蹇楋紝灝辯敱AOP妗嗘灦鏀寔瀹屾垚銆?br />5銆伮犅犅?浠g悊錛圥roxy錛夛細綆鍗曠殑璁詫紝浠g悊灝辨槸灝嗛氱煡搴旂敤鍒扮洰鏍囧璞″悗浜х敓鐨勫璞°係pring鍦ㄨ繍琛屾椂浼氱粰姣忎釜鐩爣瀵硅薄鐢熸垚涓涓唬鐞嗗璞★紝浠ュ悗鎵鏈夊鐩爣瀵硅薄鐨勬搷浣滈兘浼氶氳繃浠g悊瀵硅薄鏉ュ畬鎴愩傚彧鏈夎繖鏍烽氱煡鎵嶅彲鑳藉垏鍏ョ洰鏍囧璞°傚緋葷粺鐨勫叾浠栭儴鍒嗘潵璇達紝榪欎釜榪囩▼鏄忔槑鐨勶紝涔熷氨鏄湅璧鋒潵璺熸病鐢ㄤ唬鐞嗕竴鏍楓?br />鎴戜負浜嗙畝鍖栵紝鍙粙緇嶈繖5涓蹇點傞氳繃榪欏嚑涓蹇靛簲璇ヨ兘澶熺悊瑙pring鐨勫垏闈㈢紪紼嬩簡銆傚鏋滈渶瑕佹繁鍏ヤ簡瑙pring AOP鐨勮瘽鍐嶅幓瀛︿範鍏朵粬姒傚康涔熷緢蹇殑銆?br />涓嬮潰閫氳繃涓涓疄闄呯殑渚嬪瓙鏉ヨ鏄嶴pring鐨勫垏闈㈢紪紼嬨傜戶緇笂鏂嘒reeting鐨勪緥瀛愶紝鎴戜滑鎯沖湪Speaker姣忔璇磋瘽涔嬪墠璁板綍Speaker琚皟鐢ㄤ簡銆?br />棣栧厛鍒涘緩涓涓狶ogAdvice綾伙細
浠g爜鐗囨12錛?/font>
public class LogAdvice implements MethodBeforeAdvice聽
{
聽聽聽 public void before(Method arg0, Object[] arg1, Object arg2)throws Throwable聽
聽聽聽 {
聽聽聽聽聽聽聽 System.out.println("Speaker called!");
聽聽聽 }
}
榪欓噷娑夊強鍒頒竴涓被錛孧ethodBeforeAdvice錛岃繖涓被鏄疭pring綾誨簱鎻愪緵鐨勶紝綾諱技鐨勮繕鏈堿fterReturningAdvice絳夌瓑錛屼粠瀛楅潰灝辮兘鐞嗚В瀹冧滑鐨勫惈涔夈傚厛涓嶆ョ潃鐞嗚В榪欎釜綾伙紝鎴戠◢鍚庤В閲娿傛垜浠戶緇湅濡備綍鎶婅繖涓被搴旂敤鍒版垜浠殑緋葷粺涓幓銆?br />浠g爜鐗囨13錛?/font>
<beans>
聽聽聽 <bean id="Speaker" class="Speaker"/>
聽聽聽 <bean id="Greeting" class="Greeting">
聽聽聽聽聽聽聽 <property name="speaker">
聽聽聽聽聽聽聽聽聽聽聽 <ref bean="SpeakerProxy"/>
聽聽聽聽聽聽聽 </property>
聽聽聽 </bean>
聽聽聽 <bean id="LogAdvice" class="LogAdvice"/>
聽聽聽 <bean id="SpeakerProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
聽聽聽聽聽聽聽 <property name="proxyInterfaces">
聽聽聽聽聽聽聽聽聽聽聽 <value>ISpeaker</value>
聽聽聽聽聽聽聽 </property>
聽聽聽聽聽聽聽 <property name="interceptorNames">
聽聽聽聽聽聽聽聽聽聽聽 <list>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <value>LogAdvice</value>
聽聽聽聽聽聽聽聽聽聽聽 </list>
聽聽聽聽聽聽聽 </property>
聽聽聽聽聽聽聽 <property name="target">
聽聽聽聽聽聽聽聽聽聽聽 <ref local="Speaker"/>
聽聽聽聽聽聽聽 </property>
聽聽聽 </bean>
</beans>
鍙互鐪嬪埌鎴戜滑鐨勯厤緗枃浠朵腑澶氫簡涓や釜bean錛屼竴涓狶ogAdvice錛屽彟澶栦竴涓猄peakerProxy銆侺ogAdvice寰堢畝鍗曘傛垜鐫閲嶅垎鏋愪竴涓婼peakerProxy銆傝繖涓狟ean瀹為檯涓婃槸鐢盨pring鎻愪緵鐨凱roxyFactoryBean瀹炵幇銆備笅闈㈠畾涔変簡涓変釜渚濊禆娉ㄥ叆鐨勫睘鎬с?br />1銆伮犅犅?proxyInterfactes錛氳繖涓睘鎬у畾涔変簡榪欎釜Proxy瑕佸疄鐜板摢浜涙帴鍙o紝鍙互鏄竴涓紝涔熷彲浠ユ槸澶氫釜錛堝涓殑璇濓紝瑕佺敤list鏍囩錛夈傛垜鍓嶉潰璁茶繃Proxy鏄湪榪愯鏄姩鎬佸垱寤虹殑錛岄偅涔堣繖涓睘鎬у氨鍛婅瘔Spring鍒涘緩榪欎釜Proxy鐨勬椂鍊欏疄鐜板摢浜涙帴鍙c?br />2銆伮犅犅?interceptorNames錛氳繖涓睘鎬у畾涔変簡Proxy琚垏鍏ヤ簡鍝簺閫氱煡錛岃繖閲屽彧鏈変竴涓狶ogAdvice銆?br />3銆伮犅犅?target錛氳繖涓睘鎬у畾涔変簡琚唬鐞嗙殑瀵硅薄銆傚湪榪欎釜渚嬪瓙涓璽arget鏄疭peaker銆?br />榪欐牱鐨勫畾涔夊疄闄呬笂綰︽潫浜嗚浠g悊鐨勫璞″繀欏誨疄鐜頒竴涓帴鍙o紝榪欎笌涓婃枃璁茬殑闈㈠悜鎺ュ彛鐨勭紪紼嬫湁鐐圭被浼箋傚叾瀹炲彲浠ヨ繖鏍風悊瑙o紝鎺ュ彛鐨勫畾涔夊彲浠ヨ緋葷粺鐨勫叾浠栭儴鍒嗕笉鍙楀獎鍝嶏紝浠ュ墠鐢↖Speaker鎺ュ彛鏉ヨ皟鐢紝鐜板湪鍔犲叆浜哖roxy榪樻槸涓鏍風殑銆備絾瀹為檯涓婂唴瀹瑰凡緇忎笉涓鏍蜂簡錛屼互鍓嶆槸Speaker錛岀幇鍦ㄦ槸涓涓狿roxy銆傝宼arget灞炴цproxy鐭ラ亾鍏蜂綋鐨勬柟娉曞疄鐜板湪鍝噷銆侾roxy鍙互鐪嬩綔鏄痶arget鐨勪竴涓寘瑁呫傚綋鐒禨pring騫舵病鏈夊己鍒惰姹傜敤鎺ュ彛錛岄氳繃CGLIB錛堜竴涓珮鏁堢殑浠g爜鐢熸垚寮婧愮被搴擄級涔熷彲浠ョ洿鎺ユ牴鎹洰鏍囧璞$敓鎴愬瓙綾伙紝浣嗚繖縐嶆柟寮忓茍涓嶆帹鑽愩?br />鎴戜滑榪樺儚浠ュ墠涓鏍風殑嫻嬭瘯鎴戜滑鐨凣reeting緋葷粺錛屾祴璇曚唬鐮佸拰浠g爜鐗囨8鏄竴鏍風殑銆傝繍琛岀粨鏋滃涓嬶細
Speaker called!
Hello!
鐪嬪埌鏁堟灉浜嗗惂錛佽屼笖浣犲彲浠ュ彂鐜幫紝鎴戜滑鍔犲叆Log鍔熻兘騫舵病鏈夋敼鍙樹互鍓嶇殑浠g爜錛岀敋鑷蟲祴璇曚唬鐮侀兘娌℃湁鏀瑰彉錛岃繖灝辨槸AOP鐨勯瓍鍔涙墍鍦紒鎴戜滑鏇存敼鐨勫彧鏄厤緗枃浠躲?br />涓嬮潰瑙i噴涓涓嬪垰鎵嶈惤涓嬬殑MethodBeforeAdvice銆傚叧浜庤繖涓被鎴戝茍涓嶈緇嗕粙緇嶏紝鍥犱負榪欐秹鍙婂埌Spring涓殑鍙﹀涓涓蹇碘滆繛鎺ョ偣錛圝ointpoint錛夆濓紝鎴戣緇嗕粙緇嶄竴涓猙efore榪欎釜鏂規硶銆傝繖涓柟娉曟湁涓変釜鍙傛暟arg0琛ㄧず鐩爣瀵硅薄鍦ㄥ摢涓偣琚垏鍏ヤ簡錛屾棦鐒舵槸MethodBeforeAdvice錛岄偅褰撶劧鏄湪Method涔嬪墠琚垏鍏ヤ簡銆傞偅涔坅rg0灝辨槸琛ㄧず鐨勯偅涓狹ethod銆傜浜屼釜鍙傛暟arg1鏄疢ethod鐨勫弬鏁幫紝鎵浠ョ被鍨嬫槸Object[]銆傜涓変釜鍙傛暟灝辨槸鐩爣瀵硅薄浜嗭紝鍦℅reeting渚嬪瓙涓璦rg2鐨勭被鍨嬪疄闄呬笂鏄疭peaker銆?br />鍦℅reeting渚嬪瓙涓紝鎴戜滑騫舵病鏈夋寚瀹氱洰鏍囧璞$殑鍝簺鏂規硶瑕佽鍒囧叆錛岃屾槸榛樿鍒囧叆鎵鏈夋柟娉曡皟鐢紙铏界劧Speaker鍙湁涓涓柟娉曪級銆傞氳繃鑷畾涔塒ointcut錛屽彲浠ユ帶鍒跺垏鍏ョ偣錛屾垜榪欓噷涓嶅啀浠嬬粛浜嗭紝鍥犱負榪欏茍涓嶅獎鍝嶇悊瑙pring AOP錛屾湁鍏磋叮鐨勮瘽鍘籫oogle涓涓嬪氨鐭ラ亾浜嗐?/font>
鍏佸疄鎴楽pring
铏界劧榪欓儴鍒嗗彇鍚嶄負鈥滃疄鎴楽pring鈥濓紝浣嗗疄闄呬笂鎴戝茍涓嶆墦綆楀湪榪欓噷浠嬬粛瀹為檯寮鍙慡pring鐨勫唴瀹癸紝鍥犱負鎴戝啓榪欑瘒鏂囩珷鐨勭洰鐨勬槸浠嬬粛Spring鐨勬蹇靛拰鐢⊿pring寮鍙戠殑鎬濊礬錛岃屼笉鏄湁鍏砈pring鐨勫疄璺靛拰璇︾粏浠嬬粛銆傛枃涓粙緇嶇殑鍐呭鍜岀敤Spring鍋氬疄闄呭紑鍙戣繕鐩稿幓鐢氳繙銆備箣鎵浠ュ彇鍚嶁滃疄鎴楽pring鈥濇槸鎴戣寰楃悊瑙d簡涓婃枃璁茬殑鍐呭浠ュ悗錛屽彲浠ュ紑濮嬩負娣卞叆瀛︿範Spring鍜屽涔犲浣曞湪欏圭洰涓簲鐢⊿pring浜嗐?br />瑕佺郴緇熺殑瀛︿範Spring榪樻槸闇瑕侀槄璇諱竴鏈緇嗕粙緇峉pring鐨勪功錛屾垜鎺ㄨ崘Spring in Action錛屽洜涓烘垜鐪嬬殑灝辨槸榪欐湰涔︺傚笇鏈涜繖綃囨枃绔犺兘涓轟綘緋葷粺鐨勫涔燬pring鎵櫎涓浜涢殰紕嶃?/font>