浣滆€咃細Richard_Yi\鏉ユ簮锛歫uejin.cn/post/6844904056230690824鍓嶈█鏈珷鍐呭涓昏璁ㄨSpring寮€鍙戣繃绋嬩腑渚濊禆娉ㄥ叆鐨勫嚑涓煡璇嗙偣銆傛湁鍏磋叮鐨勮鑰呭彲浠ュ厛鐪嬬湅涓嬮潰杩欎釜闂锛欯Autowired,@Resource,@Inject涓夌娉ㄨВ鐨勫尯鍒綘鍦ㄤ娇鐢ˊAutowired鐨勬椂鍊欙紝鏈夋病鏈夊嚭鐜颁笉鎺ㄨ崘Fieldinjection鐨勮鍛婏紵浣犵煡閬撲负浠€涔堝悧锛烻pring渚濊禆娉ㄥ叆鏈夊摢浜涙柟寮忥紵瀹樻柟鎺ㄨ崘鏄粈涔堬紵濡傛灉浠ヤ笂闂浣犻兘鏄庣櫧浜嗭紝閭f垜涓汉瑙夊緱浣犵殑寮€鍙戜綋楠屽簲璇ヤ笉閿欎簡馃憤銆傛帴涓嬫潵鎴戜滑渚濇鍥炵瓟浠ヤ笂闂锛屾€荤粨鐭ヨ瘑鐐广€侤Autowired銆丂Resource銆丂Inject涓変釜娉ㄨВ鐨勫尯鍒玈pring鏀寔浣跨敤@Autowired銆丂Resource銆丂Inject涓変釜娉ㄨВ杩涜渚濊禆娉ㄥ叆銆備笅闈粙缁嶄竴涓嬭繖涓変釜娉ㄨВ鐨勫尯鍒€侤Autowired@Autowired涓篠pring妗嗘灦鎻愪緵娉ㄨВ锛岄渶瑕佸鍏ュ寘org.springframework.beans.factory.annotation.Autowired銆備笅闈㈡槸涓€涓ず渚嬩唬鐮侊紝浠ヤ究浜庤В閲婏細}}@ServicepublicclassSvcBimplementsSvc{@OverridepublicvoidsayHello(){System.out.println("浣犲ソ锛岃繖鏄湇鍔");}}@ServicepublicclassSvcCimplementsSvc{@OverridepublicvoidsayHello(){System.out.println("浣犲ソ锛岃繖鏄湇鍔");}}娴嬭瘯绫伙細@SpringBootTestpublicclassSimpleTest{@Autowired//@Qualifier("svcA")Svcsvc;@Testvoidrc(){Assertions.assertNotNull(svc);svc.sayHello();}}缁勮椤哄簭锛?.鏍规嵁绫诲瀷鍦ㄤ笂涓嬫枃涓壘鍒板尮閰嶇殑bean锛屾壘鍒扮被鍨嬩负Svc2鐨刡ean銆傚鏋滄湁澶氫釜bean锛屽垯鎸夊悕绉板尮閰嶅鏋滄湁@Qualifier娉ㄨВ锛屽垯鏍规嵁@Qualifier鎸囧畾鐨勫悕绉板尮閰嶏紝鎵惧埌鍚嶇О涓簊vcA鐨刡ean锛屽鏋滄病鏈塨ean锛屽垯鏍规嵁鍙橀噺鍚嶅尮閰嶏紝鎵惧埌bean3鍏跺悕绉颁负svcA锛屽鏋滄病鏈夋壘鍒板尮閰嶉」锛屽皢鎶ラ敊銆傦紙@Autowired(required=false)锛屽鏋滀綘璁剧疆required涓篺alse锛堥粯璁や负true锛夛紝娉ㄥ叆澶辫触鏃朵笉浼氭姏鍑哄紓甯革級@Inject鍦⊿pring鐜涓嬶紝@Inject鍜孈Autowired鏄竴鏍风殑锛屽洜涓哄畠浠殑Dependency娉ㄥ叆鏄娇鐢ˋutowiredAnnotationBeanPostProcessor澶勭悊鐨勩€侤Inject鏄疛SR-330瀹氫箟鐨勮鑼冦€傚鏋滀娇鐢ㄨ繖绉嶆柟娉曪紝涔熷彲浠ュ垏鎹㈠埌Guice銆侴uice鏄疓oogle寮€婧愮殑杞婚噺绾I妗嗘灦銆傚鏋滅‖瑕佸尯鍒嗕袱鑰咃紝棣栧厛@Inject鍖呭惈鍦↗avaEE鍖呬腑锛岄渶瑕佸湪SE鐜涓崟鐙紩鍏ャ€傚彟涓€涓尯鍒槸@Autowired鍙互璁剧疆required=false鑰孈Inject娌℃湁杩欎釜灞炴€с€侤Resource@Resource鏄疛SR-250瀹氫箟鐨勬敞瑙c€係pring鍦–ommonAnnotationBeanPostProcessor涓疄鐜颁簡瀵笿SR-250娉ㄨВ鐨勫鐞嗭紝鍖呮嫭@Resource銆侤Resource鏈変袱涓噸瑕佺殑灞炴€э細name鍜宼ype锛孲pring灏咢Resource娉ㄨВ鐨刵ame灞炴€цВ鏋愪负bean鐨勫悕绉帮紝type灞炴€цВ鏋愪负bean鐨勭被鍨嬨€傜粍瑁呴『搴忥細濡傛灉鍚屾椂鎸囧畾name鍜宼ype锛屽垯浠嶴pring涓婁笅鏂囦腑瀵绘壘鍞竴鍖归厤鐨刡ean杩涜缁勮锛屾壘涓嶅埌鍒欐姏鍑哄紓甯搞€傚鏋滄寚瀹氫簡鍚嶇О锛屽垯浠庝笂涓嬫枃涓煡鎵惧叿鏈夊尮閰嶅悕绉帮紙id锛夌殑bean杩涜缁勮锛屽鏋滄壘涓嶅埌鍒欐姏鍑哄紓甯搞€傚鏋滄寚瀹氫簡绫诲瀷锛屽垯浠庝笂涓嬫枃涓壘鍒板敮涓€涓庤绫诲瀷鍖归厤鐨刡ean浠ヨ繘琛岀粍瑁呫€傚鏋滄病鏈夋壘鍒版垨鎵惧埌澶氫釜bean锛屽皢鎶涘嚭寮傚父銆傚鏋滄棦涓嶆寚瀹歯ame涔熶笉鎸囧畾type锛屽垯榛樿鎸夌収byName杩涜缁勮锛涘鏋滄病鏈夊尮閰嶅埌锛屽垯鎸夌収byTypeh杩涜缁勮銆侷DEA鎻愮ずFieldinjectionisnotrecommended鍦ㄤ娇鐢↖DEA杩涜Spring寮€鍙戞椂锛屽湪瀛楁涓婁娇鐢ˊAutowired娉ㄨВ鏃讹紝浼氬彂鐜癐DEA浼氭湁璀﹀憡鎻愮ず锛欶ieldinjectionisnotrecommendedInspectioninfo:SpringTeamRecommends:"Alwaysusebean涓熀浜庢瀯閫犲嚱鏁扮殑渚濊禆娉ㄥ叆銆傚缁堝寮哄埗渚濊禆浣跨敤鏂█鈥濄€傜炕璇戣繃鏉ュ氨鏄細涓嶆帹鑽愪娇鐢╢ield-based娉ㄥ叆銆係pring寮€鍙戝洟闃熷缓璁偍濮嬬粓鍦⊿pringBean涓娇鐢ㄥ熀浜庢瀯閫犲嚱鏁扮殑渚濊禆娉ㄥ叆銆傚缁堝鎵€闇€鐨勪緷璧栭」浣跨敤鏂█銆備緥濡備笅闈㈢殑浠g爜锛欯ServicepublicclassHelpService{@Autowired@Qualifier("svcB")privateSvcsvc;publicvoidsayHello(){svc.sayHello();}}publicinterfaceSvc{voidsayHello();}@ServicepublicclassSvcBimplementsSvc{@OverridepublicvoidsayHello(){System.out.println("浣犲ソ锛岃繖鏄湇鍔");}}鎶婂厜鏍囨斁鍦ˊAutowired锛岀敤Alt+Enter淇敼锛屼唬鐮佷細鏍规嵁Constructor鏀瑰彉Injection鏂规硶锛屼慨鏀瑰悗锛欯ServicepublicclassHelpService{privatefinalSvcsvc;@AutowiredpublicHelpService(@Qualifier("svcB")Svcsvc){//Assert.notNull(svc,"svc涓嶈兘涓簄ull");杩欎釜.svc=svc;}publicvoidsayHello(){svc.sayHello();}}濡傛灉鎸夌収Spring鍥㈤槦鐨勫缓璁紝濡傛灉svc鏄繀瑕佺殑渚濊禆锛屽簲璇ヤ娇鐢ˋssert.notNull(svc,"svcmustnotbenull")鏉ョ‘璁ゃ€傝繖涓獁arning鎻愮ず寰堝鏄撲慨澶嶏紝浣嗘槸鎴戣寰楁洿閲嶈鐨勬槸鐞嗚ВSpring鍥㈤槦涓轰粈涔堜細鎻愬嚭杩欐牱鐨勫缓璁紵鐩存帴浣跨敤杩欑鍩轰簬瀛楁鐨勬敞鍏ユ湁浠€涔堥棶棰樺憿锛熸帹鑽愪竴涓猄pringBoot鍩虹鏁欑▼鍜屽疄渚嬶細https://github.com/javastacks...棣栧厛鎴戜滑瑕佺煡閬揝pring涓緷璧栨敞鍏ョ殑鏂瑰紡涓€鍏辨湁涓夌锛氬熀浜庡瓧娈电殑娉ㄥ叆锛坧ropertyinjection锛夊熀浜巓nsetterinjectionbasedonconstructorInjection锛堟瀯閫犲嚱鏁版敞鍏ワ級1.Field-basedinjection鎵€璋撶殑field-basedinjection灏辨槸鍒╃敤bean鍙橀噺涓婄殑娉ㄨВ杩涜渚濊禆娉ㄥ叆銆傛湰璐ㄤ笂锛屽畠鏄€氳繃鍙嶅皠鐩存帴娉ㄥ叆鍒板満涓殑銆傝繖鏄垜骞虫椂寮€鍙戜腑瑙佸緱鏈€澶氾紝涔熸槸鏈€鐔熸倝鐨勬柟寮忋€傚悓鏃朵篃鏄疭pring鍥㈤槦涓嶆帹鑽愮殑鏂瑰紡銆備緥濡傦細@AutowiredprivateSvcsvc锛?銆佸湪setter鏂规硶娉ㄥ叆鐨勫熀纭€涓婏紝浣跨敤瀵瑰簲鍙橀噺鐨剆etXXX()鏂规硶锛屽苟鍦ㄦ柟娉曚笂浣跨敤娉ㄨВ锛屽畬鎴愪緷璧栨敞鍏ャ€備緥濡傦細privateHelperhelper;@AutowiredpublicvoidsetHelper(Helperhelper){this.helper=helper;}娉ㄦ剰锛氬湪Spring4.3鍙婁箣鍚庣殑鐗堟湰涓紝setter涓婄殑@Autowired娉ㄨВ鍙互鐪佺暐銆?.鍩轰簬鏋勯€犲嚱鏁版敞鍏ワ紝灏嗘墍鏈夐渶瑕佺殑渚濊禆鏀惧湪甯︽敞瑙g殑鏋勯€犲嚱鏁扮殑鍙傛暟涓紝骞跺湪鏋勯€犲嚱鏁颁腑瀹屾垚鐩稿簲鍙橀噺鐨勫垵濮嬪寲銆傝鏂规硶鏄熀浜庢瀯閫犲嚱鏁扮殑娉ㄥ叆銆備緥濡傦細privatefinalSvcsvc锛汙AutowiredpublicHelpService(@Qualifier("svcB")svcsvc){this.svc=svc;}鍦⊿pring4.3鍙婁箣鍚庣殑鐗堟湰涓紝濡傛灉杩欎釜绫诲彧鏈変竴涓瀯閫犲嚱鏁帮紝閭d箞杩欎釜鏋勯€犲嚱鏁颁笂闈篃鍙互涓嶅啓@Autowired娉ㄨВ.鍩轰簬瀛楁娉ㄥ叆鐨勫ソ澶勫彲浠ョ湅鍒帮紝杩欑鏂规硶闈炲父绠€娲侊紝浠g爜鐪嬭捣鏉ヤ篃闈炲父绠€鍗曟槗鎳傘€傛偍鐨勭被鍙互涓撴敞浜庝笟鍔¤€屼笉浼氳渚濊禆娉ㄥ叆姹℃煋銆傛偍鍙渶鍦ㄥ彉閲忎笂娣诲姞@Autowired锛屼笉闇€瑕佺壒娈婄殑鏋勯€犲嚱鏁版垨璁剧疆鍣紝渚濊禆娉ㄥ叆瀹瑰櫒灏嗘彁渚涙偍闇€瑕佺殑渚濊禆椤广€傚熀浜庡瓧娈电殑娉ㄥ叆鐨勭己鐐规垚鍔熶笌澶辫触钀т綍鍩轰簬瀛楁鐨勬敞鍏ヨ櫧鐒剁畝鍗曪紝浣嗘槸浼氬甫鏉ュ緢澶氶棶棰樸€傝繖浜涢棶棰樻槸鎴戝钩鏃跺紑鍙戝拰闃呰椤圭洰浠g爜鏃剁粡甯搁亣鍒扮殑銆傚緢瀹规槗杩濆弽鍗曚竴鑱岃矗鍘熷垯銆備娇鐢ㄨ繖绉嶅熀浜庡瓧娈垫敞鍏ョ殑鏂瑰紡锛屾坊鍔犱緷璧栭潪甯哥畝鍗曘€傚嵆浣夸綘鐨勭被涓湁鍗佸嚑涓緷璧栭」锛屼綘鍙兘浼氳寰楁病鏈夐棶棰樸€傛櫘閫氬紑鍙戣€呭彲鑳戒細涓嶈嚜瑙夊湴缁橝绫绘坊鍔犲緢澶氫緷璧栥€備絾鏄綋浣跨敤鏋勯€犲嚱鏁版敞鍏ユ椂锛屽湪鏌愪釜鏃跺埢锛屾瀯閫犲嚱鏁颁腑鐨勫弬鏁板彉寰楀姝や箣澶氾紝浠ヨ嚦浜庡緢鏄庢樉鍑轰簡闂銆備緷璧栧お澶氶€氬父鎰忓懗鐫€浣犵殑绫昏鎵挎媴鏇村鐨勮矗浠伙紝杩欐樉鐒惰繚鍙嶄簡鍗曚竴璐d换鍘熷垯锛圫RP锛歋ingleresponsibilityprinciple锛夈€傝繖涓棶棰樺湪鎴戜滑鍏徃鐨勯」鐩唬鐮佷腑纭疄寰堝父瑙併€備緷璧栨敞鍏ユ鏋剁殑鏍稿績鎬濇兂涔嬩竴鏄鍣ㄧ鐞嗙殑绫讳笉搴旇渚濊禆浜庡鍣ㄤ娇鐢ㄧ殑渚濊禆椤广€備篃灏辨槸璇达紝杩欎釜绫诲簲璇ユ槸涓€涓畝鍗曠殑POJO锛圥lainOrdinaryJavaObject锛夛紝鍙互鍗曠嫭瀹炰緥鍖栵紝浣犱篃鍙互涓哄畠鎻愪緵瀹冮渶瑕佺殑渚濊禆銆傝繖涓棶棰樺叿浣撳彲浠ヨ〃鐜板湪锛氫綘鐨勭被鍜屼緷璧栫殑瀹瑰櫒鏄己鑰﹀悎鐨勶紝浣犱笉鑳藉湪瀹瑰櫒澶栦娇鐢ㄤ綘鐨勭被銆傛偍涓嶈兘缁曡繃鍙嶅皠锛堜緥濡傦紝鍗曞厓娴嬭瘯鏃讹級杩涜瀹炰緥鍖栥€傚繀椤婚€氳繃渚濊禆瀹瑰櫒鏉ュ疄渚嬪寲锛屾洿鍍忔槸涓€涓泦鎴愭祴璇曪紝涓嶈兘浣跨敤灞炴€ф敞鍏ユ瀯寤轰笉鍙彉瀵硅薄锛坒inal淇グ鍙橀噺锛塖pring寮€鍙戠粍鐨勫缓璁棦鐒跺彲浠ユ贩鍚坈onstructor-based鍜宻etter-basedDI锛岄偅涔堝畠涓€涓緢濂界殑缁忛獙娉曞垯鏄寮哄埗渚濊禆椤逛娇鐢ㄦ瀯閫犲嚱鏁帮紝瀵瑰彲閫変緷璧栭」浣跨敤setter鏂规硶鎴栭厤缃柟娉曘€傜畝鍗曟潵璇达紝濡傛灉寮哄埗渚濊禆鏄彲閫夌殑锛屽氨浣跨敤鏋勯€犳柟娉曪紝瀵逛簬鍙橀噺渚濊禆锛屼娇鐢╯etter娉ㄥ叆銆傚綋鐒讹紝浣犲彲浠ュ湪鍚屼竴涓被涓娇鐢ㄨ繖涓や釜鏂规硶銆傛瀯閫犲嚱鏁版敞鍏ユ洿閫傚悎閽堝涓嶅彲鍙樻€х殑寮哄埗娉ㄥ叆锛宻etter娉ㄥ叆鏇撮€傚悎鍙彉鎬ф敞鍏ャ€備笅闈㈢湅鐪婼pring鎺ㄨ崘鐨勫師鍥犮€傜涓€绉嶆槸鍩轰簬鏋勯€犲嚱鏁版敞鍏ャ€係pring鍥㈤槦鏅亶鎻愬€℃瀯閫犲嚱鏁版敞鍏ワ紝鍥犱负瀹冧娇浜轰滑鑳藉灏嗗簲鐢ㄧ▼搴忕粍浠跺疄鐜颁负涓嶅彲鍙樺璞★紝骞剁‘淇濇墍闇€鐨勪緷璧栭」涓嶄负绌恒€傛澶栵紝鏋勯€犲嚱鏁版敞鍏ョ殑缁勪欢鎬绘槸浠ュ畬鍏ㄥ垵濮嬪寲鐨勭姸鎬佽繑鍥炵粰瀹㈡埛绔紙璋冪敤锛変唬鐮併€備綔涓烘梺娉紝澶ч噺鐨勬瀯閫犲嚱鏁板弬鏁版槸涓€绉嶇碂绯曠殑浠g爜鍛抽亾锛屾殫绀鸿绫诲彲鑳芥湁澶璐d换锛屽簲璇ラ噸鏋勪互鏇村ソ鍦拌В鍐冲叧娉ㄧ偣鐨勯€傚綋鍒嗙銆係pring鍥㈤槦鎻愬€′娇鐢╟onstructor-basedinjection锛屽洜涓轰竴鏂归潰鍙互灏嗕緷璧栨敞鍏ュ埌涓€涓笉鍙彉鐨勫彉閲忎腑锛堟敞锛歠inal淇グ鐨勫彉閲忥級锛屽彟涓€鏂归潰涔熷彲浠ヤ繚璇佸彇鍊艰繖浜涘彉閲忎笉浼氫负绌恒€傚彟澶栵紝閫氳繃鏋勯€犳柟娉曞畬鎴愪緷璧栨敞鍏ョ殑缁勪欢锛堟敞锛氬鍚勭鏈嶅姟锛夊彲浠ヤ繚璇佸湪琚皟鐢ㄦ椂瀹屽叏灏辩华銆傚悓鏃讹紝浠庝唬鐮佽川閲忕殑瑙掑害鏉ョ湅锛屼竴涓法澶х殑鏋勯€犲嚱鏁伴€氬父浠h〃涓€绉嶄唬鐮佸懗閬擄紝绫诲彲鑳芥壙鎷呬簡澶鐨勮矗浠汇€傝€屽浜庡熀浜巗etter鐨勬敞鍏ワ紝浠栦滑鏄繖鏍疯鐨勶細Setter娉ㄥ叆搴旇涓昏鍙敤浜庡彲閫夌殑渚濊禆椤癸紝杩欎簺渚濊禆椤瑰彲浠ュ湪绫诲唴鍒嗛厤鍚堢悊鐨勯粯璁ゅ€笺€傚惁鍒欙紝蹇呴』鍦ㄤ唬鐮佷娇鐢ㄤ緷璧栭」鐨勪换浣曞湴鏂规墽琛岄潪绌烘鏌ャ€俿etter娉ㄥ叆鐨勪竴涓ソ澶勬槸setter鏂规硶浣胯绫荤殑瀵硅薄鍙互鍦ㄤ互鍚庨噸鏂伴厤缃垨閲嶆柊娉ㄥ叆銆傚熀浜巗etter鐨勬敞鍏ュ簲璇ュ彧鐢ㄤ簬娉ㄥ叆闈炲繀闇€鐨勪緷璧栵紝骞朵笖搴旇涓鸿繖绉嶄緷璧栨彁渚涗竴涓被鍚堢悊鐨勯粯璁ゅ€笺€傚鏋滀娇鐢╯etter鏉ユ敞鍏ユ墍闇€鐨勪緷璧栭」锛屽皢浼氭湁澶鐨勭┖妫€鏌ユ饭娌′唬鐮併€備娇鐢╯etter娉ㄥ叆鐨勪竴涓紭鐐规槸杩欑渚濊禆鍏崇郴鍙互寰堝鏄撳湴鏇存敼鎴栭噸鏂版敞鍏ャ€傝繎鏈熺儹鐐规枃绔犳帹鑽愶細1.1000+Java闈㈣瘯棰樺強绛旀锛?022鏈€鏂扮増锛?.鍘夊浜嗭紒Java鍗忕▼鏉ヤ簡銆?.3.SpringBoot2.x鏁欑▼锛屽お鍏ㄩ潰浜嗭紒4.涓嶈鐢ㄧ垎鐮寸垎婊$敾闈紝璇曡瘯瑁呴グ鑰呮ā寮忥紝杩欐墠鏄紭闆呯殑鏂瑰紡锛侊紒5.銆奐ava寮€鍙戞墜鍐岋紙宓╁北鐗堬級銆嬫渶鏂板彂甯冿紝璧跺揩涓嬭浇鍚э紒鎰熻涓嶉敊锛屽埆蹇樹簡鐐硅禐+杞彂锛?/p>
