這篇文章主要講解了“Spring中IoC的詳細介紹”,文中的講解內容簡(jiǎn)單清晰,易于學(xué)習與理解,下面請大家跟著(zhù)小編的思路慢慢深入,一起來(lái)研究和學(xué)習“Spring中IoC的詳細介紹”吧!
Spring中的IoC:
1)概念:把對象的創(chuàng )建、初始化、銷(xiāo)毀等工作交給spring容器來(lái)做。由spring容器控制對象的生命周期。 2)目的:為了解決多個(gè)對象之間的依賴(lài)關(guān)系。 3)原理: 1)通過(guò)配置文件(或注解)的方式來(lái)描述bean與bean之間的依賴(lài)關(guān)系。 2)通過(guò)動(dòng)態(tài)代理和java的反射機制來(lái)實(shí)例化bean,同時(shí)建立bean之間的依賴(lài)關(guān)系。 4)spring容器創(chuàng )建對象的3種方式(bean的實(shí)例化): 1)使用Spring的IoC創(chuàng )建對象:調用默認的構造函數(默認) 1>指定bean的class屬性 2>class需要一個(gè)默認的空構造器 <bean id="helloWorld" class="com.jxn.HelloWorld" /> 得到實(shí)例對象:HelloWorld helloWorld = (HelloWorld)context.getBean("helloWorld"); 2)在Spring中使用工廠(chǎng)模式創(chuàng )建對象: 使用靜態(tài)工廠(chǎng)方法 1>指定class屬性外 2>通過(guò)factory-method屬性來(lái)指定創(chuàng )建bean實(shí)例的靜態(tài)工廠(chǎng)方法 <bean id="helloWorld" class="com.jxn.HelloWorldFactory" factory-method="createInstance"></bean> 注:相當于調用了 HelloWorldFactory.createInstance(); public class HelloWorldFactory { public static HelloWorld createInstance(){ return new HelloWorld(); } } 得到實(shí)例對象:HelloWorld helloWorld = (HelloWorld)context.getBean("helloWorld"); 使用實(shí)例工廠(chǎng)方法 1>定義一個(gè)工廠(chǎng)類(lèi) 2>通過(guò)factory-bean屬性指定工廠(chǎng)類(lèi),通過(guò)factory-method屬性指定該工廠(chǎng)類(lèi)的非靜態(tài)工廠(chǎng)方法 <bean id="helloWorldFactory" class="com.jxn.HelloWorldFactory" /> <bean id="HelloWorld" factory-bean="helloWorldFactory" factory-method="createInstance" /> 注:相當于調用了 new HelloWorldFactory.createInstance(); public class HelloWorldFactory { public HelloWorld createInstance(){ return new HelloWorld(); } } 得到實(shí)例對象:HelloWorld helloWorld = (HelloWorld)context.getBean("helloWorld"); 3)使用Spring的IoC創(chuàng )建對象 VS 使用工廠(chǎng)模式創(chuàng )建對象 當創(chuàng )建的對象需要修改(eg:新增屬性)時(shí): Spring的IoC只需要修改對象對應的類(lèi)即可。 工廠(chǎng)模式需要修改或添加工廠(chǎng)方法。 5)DI(依賴(lài)注入):給對象的屬性賦值 1)使用屬性的setter方法進(jìn)行注入: 說(shuō)明:通過(guò)調用無(wú)參構造器或無(wú)參static工廠(chǎng)方法實(shí)例化bean之后,調用該bean的setter方法,即可實(shí)現基于setter的依賴(lài)注入。 舉例: <!-- property是用來(lái)描述一個(gè)類(lèi)的屬性:直接變量(基本類(lèi)型、String類(lèi)型等)用value賦值,引用類(lèi)型用ref賦值 --> <bean id="student" class="com.jxn.domain.Student" /> <bean id="person" class="com.jxn.domain.Person"> <!-- 直接變量 --> <property name="name" value="aaa" /> <!-- 引用類(lèi)型 --> <property name="student" ref="student"> <!-- List --> <property name="lists"> <list> <value>list1</value> <ref bean="student"/> <value>list3</value> </list> </property> <!-- Map --> <property name="map"> <map> <entry key="m1"> <value>map1</value> </entry> <entry key="m2"> <ref bean="student"/> </entry> </map> </property> <!-- Properties --> <property name="properties"> <props> <prop key="key1">value1</prop> <prop key="key2">value2</prop> </props> </property> </bean> 2)使用構造器注入:通過(guò)調用帶參數的構造器來(lái)實(shí)現: 說(shuō)明: 1>如果spring的配置文件的bean中沒(méi)有<constructor-arg>標簽,則調用默認的構造方法 2>如果spring的配置文件的bean中有<constructor-arg>標簽,則該元素確定唯一的構造方法,該標簽的屬性 index 指參數的位置,從0開(kāi)始 type 指參數的類(lèi)型,如果不寫(xiě)仍可確定唯一的構造方法,則可以省略type屬性 value 給基本類(lèi)型賦值 ref 給引用類(lèi)型賦值 舉例: <bean id="person" class="com.jxn.domain.Person"> <constructor-arg index="0" type="java.lang.Long" value="1"></constructor-arg> <constructor-arg index="1" value="zhangsan"></constructor-arg> <constructor-arg index="2" ref="student"></constructor-arg> </bean> <bean id="student" class="com.jxn.domain.Student" /> ??
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站