锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
]]>
]]>
IoC灝辨槸Inversion of Control錛屾帶鍒跺弽杞傚湪Java寮鍙戜腑錛?/span>IoC鎰忓懗鐫灝嗕綘璁捐濂界殑綾諱氦緇欑郴緇熷幓鎺у埗錛岃屼笉鏄湪浣犵殑綾誨唴閮ㄦ帶鍒躲傝繖縐頒負鎺у埗鍙嶈漿銆?/span>
涓嬮潰鎴戜滑浠ュ嚑涓緥瀛愭潵璇存槑浠涔堟槸IoC
鍋囪鎴戜滑瑕佽璁′竴涓?/span>Girl鍜屼竴涓?/span>Boy綾伙紝鍏朵腑Girl鏈?/span>kiss鏂規硶錛屽嵆Girl鎯寵Kiss涓涓?/span>Boy銆傞偅涔堬紝鎴戜滑鐨勯棶棰樻槸錛?/span>Girl濡備綍鑳藉璁よ瘑榪欎釜Boy錛?/span>
鍦ㄦ垜浠腑鍥斤紝甯歌鐨勶輯錛笌GG鐨勮璇嗘柟寮忔湁浠ヤ笅鍑犵
錛戙闈掓绔歸┈錛?/span> 錛掋浜插弸浠嬬粛錛?/span> 錛撱鐖舵瘝鍖呭姙
閭d箞鍝竴縐嶆墠鏄渶濂藉憿錛?/span>
闈掓绔歸┈錛?/span>Girl浠庡皬灝辯煡閬撹嚜宸辯殑Boy銆?/span>
public
class
Girl {
|
鐒惰屼粠寮濮嬪氨鍒涘緩鐨?/span>Boy緙虹偣灝辨槸鏃犳硶鍦ㄦ洿鎹€傚茍涓旇璐熻矗Boy鐨勬暣涓敓鍛藉懆鏈熴傚鏋滄垜浠殑Girl鎯寵鎹竴涓庝箞鍔烇紵錛堢瑪鑰呬弗閲嶄笉鏀寔Girl緇忓父鏇存崲Boy錛?/span>
浜插弸浠嬬粛錛氱敱涓棿浜鴻礋璐f彁渚?/span>Boy鏉ヨ闈?/span>
|
浜插弸浠嬬粛錛屽浐鐒舵槸濂姐傚鏋滀笉婊℃剰錛屽敖綆″彟澶栨崲涓涓ソ浜嗐備絾鏄紝浜插弸BoyFactory緇忓父鏄互Singleton鐨勫艦寮忓嚭鐜幫紝涓嶇劧灝辨槸錛屽瓨鍦ㄤ簬Globals錛屾棤澶勪笉鍦紝鏃犲涓嶈兘銆傚疄鍦ㄦ槸澶箒鐞愪簡涓鐐癸紝涓嶅鐏墊椿銆傛垜涓轟粈涔堜竴瀹氳榪欎釜浜插弸鎺哄拰榪涙潵鍛紵涓轟粈涔堜竴瀹氳浠樼粰濂逛粙緇嶈垂鍛紵涓囦竴鏈濂界殑鏈嬪弸鐖變笂浜嗘垜鐨勭敺鏈嬪弸鍛紵
鐖舵瘝鍖呭姙錛氫竴鍒囦氦緇欑埗姣嶏紝鑷繁涓嶇敤璐瑰惞鐏頒箣鍔涳紝鍙渶瑕佺瓑鐫Kiss灝卞ソ浜嗐?/span>
void kiss(Boy boy){ // kiss boy boy.kiss(); } } |
Well錛岃繖鏄Girl鏈濂界殑鏂規硶錛屽彧瑕佹兂鍔炴硶璐胯祩浜?/span>Girl鐨勭埗姣嶏紝騫舵妸Boy浜ょ粰浠栥傞偅涔堟垜浠氨鍙互杞繪澗鐨勫拰Girl鏉?/span>Kiss浜嗐傜湅鏉ュ嚑鍗冨勾浼犵粺鐨勭埗姣嶄箣鍛借繕鐪熸槸鏈夌敤鍝︺傝嚦灝?/span>Boy鍜?/span>Girl涓嶇敤鑷繁鐬庡繖涔庝簡銆?/span>
榪欏氨鏄?/span>IOC錛屽皢瀵硅薄鐨勫垱寤哄拰鑾峰彇鎻愬彇鍒板閮ㄣ傜敱澶栭儴瀹瑰櫒鎻愪緵闇瑕佺殑緇勪歡銆?/span>
鎴戜滑鐭ラ亾濂借幈鍧炲師鍒?/span>錛?/span>“Do not call us, we will call you.” 鎰忔濆氨鏄紝You, girlie, do not call the boy. We will feed you a boy銆?/span>
鎴戜滑榪樺簲璇ョ煡閬?strong>渚濊禆鍊掕漿鍘熷垯鍗?/span> Dependence Inversion Princinple錛?/span>DIP銆?/span>
Eric Gamma璇達紝瑕侀潰鍚戞娊璞$紪紼嬨傞潰鍚戞帴鍙g紪紼嬫槸闈㈠悜瀵硅薄鐨勬牳蹇冦?/span>
緇勪歡搴旇鍒嗕負涓ら儴鍒嗭紝鍗?/span>
Service, 鎵鎻愪緵鍔熻兘鐨勫0鏄?/span>
Implementation, Service鐨勫疄鐜?/span>
濂藉鏄細澶氬疄鐜板彲浠ヤ換鎰忓垏鎹紝闃叉 “everything depends on everything” 闂錛庡嵆鍏蜂綋渚濊禆浜庡叿浣撱?/span>
鎵浠ワ紝鎴戜滑鐨?/span>Boy搴旇鏄疄鐜?/span>Kissable鎺ュ彛銆傝繖鏍蜂竴鏃?/span>Girl涓嶆兂kiss鍙伓鐨?/span>Boy鐨勮瘽錛岃繕鍙互kiss鍙埍鐨?/span>kitten鍜屾厛紲ョ殑grandmother銆?/span>
浜屻?/span>IOC鐨?/span>type
IoC鐨?/span>Type鎸囩殑鏄?/span>Girl寰楀埌Boy鐨勫嚑縐嶄笉鍚屾柟寮忋傛垜浠愪竴鏉ヨ鏄庛?/span>
IOC type 0錛?/span>涓嶇敤IOC
public class Girl implements Servicable { private Kissable kissable; public Girl()
{ public
void
kissYourKissable() { }
|
Girl鑷繁寤虹珛鑷繁鐨?/span>Boy錛屽緢闅炬洿鎹紝寰堥毦鍏變韓緇欏埆浜猴紝鍙兘鍗曠嫭浣跨敤錛屽茍璐熻矗瀹屽叏鐨勭敓鍛藉懆鏈熴?/span>
IOC type 1錛?/span>鍏堢湅浠g爜錛?/span>
public class Girl implements Servicable { Kissable kissable; public
void
service(ServiceManager mgr) { public
void
kissYourKissable() { }
|
榪欑鎯呭喌鍑虹幇浜?/span>Avalon Framework銆備竴涓粍浠跺疄鐜頒簡Servicable鎺ュ彛錛屽氨蹇呴』瀹炵幇service鏂規硶錛屽茍浼犲叆涓涓?/span>ServiceManager銆傚叾涓細鍚湁闇瑕佺殑鍏跺畠緇勪歡銆傚彧闇瑕佸湪service鏂規硶涓垵濮嬪寲闇瑕佺殑Boy銆?/span>
鍙﹀錛?/span>J2EE涓粠Context鍙栧緱瀵硅薄涔熷睘浜?/span>type 1銆?/span>
瀹冧緷璧栦簬閰嶇疆鏂囦歡
<container> <component
name=“girl"
class=“Girl"
/>
|
IOC type 2錛?/span>
public class Girl { private Kissable kissable; public
void
setKissable(Kissable kissable) { public
void
kissYourKissable() { }
|
Type 2鍑虹幇浜?/span>Spring Framework錛屾槸閫氳繃JavaBean鐨?/span>set鏂規硶鏉ュ皢闇瑕佺殑Boy浼犻掔粰Girl銆傚畠蹇呴』渚濊禆浜庨厤緗枃浠躲?/span>
<beans>
|
IOC type 3
public class Girl { private Kissable kissable; public Girl(Kissable
kissable) { public
void
kissYourKissable() { }
|
榪欏氨鏄?/span>PicoContainer鐨勭粍浠?/span> 銆傞氳繃鏋勯犲嚱鏁頒紶閫?/span>Boy緇?/span>Girl銆?/span>
PicoContainer container =
new
DefaultPicoContainer();
|
鍏充簬PicoContainer錛屼綔鑰呭悗緇枃绔犱細璇︾粏浠嬬粛銆?/span>
浣滆呰錛?/span>
Well錛屼互涓婄殑榪欎簺鐞嗚閮ㄥ垎鏈変簺宸茬粡鏈変簡鏂扮殑瀹氫箟浜嗐傝繃浜涘ぉ鎴戜細鍐嶅啓涓浜涙枃绔犲叿浣撹鏄庛傛瘮濡傦紝鍘熸潵鐨勪笁縐?/span>type緇撴瀯鐜板湪宸茬粡閲嶆柊瀹氫箟涓轟緷璧栨敞灝勭殑璁稿灞傛銆?/span>
IoC寰堝勾杞伙紝榪樺湪鍙戝睍銆備即闅忕潃IOC鐨勫彂灞曪紝AOP錛?/span>COP錛?/span>SOP絳夌瓑閮藉湪涓嶆柇鐨勫彂灞曘備綔涓虹▼搴忓憳錛岄殢鏃跺叧娉ㄧ潃鏂扮殑鎬濇兂鐨勫彂灞曟槸涓浠跺緢杞繪澗鎰夊揩鐨勪簨鎯呫傛湁娌℃湁浜烘効鎰忓拰鎴戜竴璧鋒帰璁ㄥ涔犲叡鍚岃繘姝ュ憖錛?/span>
鎽樿嚜錛歨ttp://dev.csdn.net/develop/article/24/24397.shtm
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <!-- our Authenticator implementation --> <bean id="smtpAuthenticator" class="forums.mailtest.SmtpAuthenticator"> <constructor-arg value="yourname@gmail.com" /> <constructor-arg value="password" /> </bean> <!-- now setup an authenticated session --> <bean id="mailSession" class="javax.mail.Session" factory-method="getInstance"> <constructor-arg> <props> <prop key="mail.smtp.auth">true</prop> <prop key="mail.smtp.socketFactory.port">465</prop> <prop key="mail.smtp.socketFactory.class"> javax.net.ssl.SSLSocketFactory </prop> <prop key="mail.smtp.socketFactory.fallback"> false </prop> </props> </constructor-arg> <constructor-arg ref="smtpAuthenticator" /> </bean> <!-- and configure the MailSender with the authenticated session --> <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> <property name="host" value="smtp.gmail.com" /> <property name="session" ref="mailSession" /> </bean> <!-- this is a template message that we can pre-load with default state --> <bean id="templateMessage" class="org.springframework.mail.SimpleMailMessage"> <property name="from" value="yourname@gmail.com" /> <property name="subject" value="Testing" /> </bean> <bean id="mailTest" class="forums.mailtest.MailTest"> <constructor-arg ref="mailSender" /> <constructor-arg ref="templateMessage" /> </bean> </beans>
package forums.mailtest; import javax.mail.Authenticator; import javax.mail.PasswordAuthentication; public class SmtpAuthenticator extends Authenticator { private String username; private String password; public SmtpAuthenticator(String username, String password) { super(); this.username = username; this.password = password; } public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } }
package forums.mailtest; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.mail.MailException; import org.springframework.mail.MailSender; import org.springframework.mail.SimpleMailMessage; public class MailTest { private MailSender mailSender; private SimpleMailMessage templateMessage; public MailTest(MailSender mailSender, SimpleMailMessage templateMessage) { super(); this.mailSender = mailSender; this.templateMessage = templateMessage; } public void sendMeMail() { SimpleMailMessage msg = new SimpleMailMessage(templateMessage); msg.setTo("test@example.com"); msg.setText("This is a test.\nGo Spring!\n"); try { this.mailSender.send(msg); } catch (MailException e) { System.err.println("Didn't work."); e.printStackTrace(); } } public static final void main(String[] args) { ApplicationContext appCtx = new ClassPathXmlApplicationContext(new String[] { "forums/mailtest/application-config.xml" }); MailTest tester = (MailTest) appCtx.getBean("mailTest"); tester.sendMeMail(); } }