麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 編程 > JSP > 正文

詳解Spring的核心機(jī)制依賴注入

2024-09-05 00:23:30
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

詳解Spring的核心機(jī)制依賴注入

對(duì)于一般的Java項(xiàng)目,他們都或多或少有一種依賴型的關(guān)系,也就是由一些互相協(xié)作的對(duì)象構(gòu)成的。Spring把這種互相協(xié)作的關(guān)系稱為依賴關(guān)系。如A組件調(diào)用B組件的方法,可稱A組件依賴于B組件,依賴注入讓Spring的Bean以配置文件組織在一起,而不是以硬編碼的方式耦合在一起

一、理解依賴注入

依賴注入(Dependency Injection) = 控制反轉(zhuǎn)(Inversion ofControl,IoC):當(dāng)某個(gè)Java實(shí)例(調(diào)用者)需另一個(gè)Java實(shí)例(被調(diào)用者)時(shí),在依賴注入模式下,創(chuàng)建被調(diào)用者的工作不再由調(diào)用者來(lái)完成,因此稱為 控制反轉(zhuǎn) ;創(chuàng)建被調(diào)用者實(shí)例的工作通常由Spring容器來(lái)完成,然后注入調(diào)用者,因此也稱為 依賴注入

依賴注入:程序運(yùn)行過(guò)程中,如需另一個(gè)對(duì)象協(xié)作(調(diào)用它的方法、訪問(wèn)他的屬性)時(shí),無(wú)須在代碼中創(chuàng)建被調(diào)用者,而是依賴于外部容器的注入。Spring的依賴注入對(duì)調(diào)用者和被調(diào)用者幾乎無(wú)任何要求,完全支持對(duì)POJO間依賴關(guān)系的管理

依賴注入

設(shè)值注入:IoC容器使用屬性的setter方法來(lái)注入被依賴的實(shí)例

構(gòu)造注入:IoC容器使用構(gòu)造器來(lái)注入被依賴的實(shí)例

理解依賴注入:

一個(gè)人(Java實(shí)例,調(diào)用者)需要一把斧子(Java實(shí)例,被調(diào)用者)

在原始社會(huì)里,幾乎沒(méi)有社會(huì)分工;需要斧子的人(調(diào)用者)只能自己去磨一把斧子(被調(diào)用者);對(duì)應(yīng)情形為:Java程序里的調(diào)用者自己創(chuàng)建被調(diào)用者,通常采用new關(guān)鍵字調(diào)用構(gòu)造器創(chuàng)建一個(gè)被調(diào)用者

進(jìn)入工業(yè)社會(huì),工廠出現(xiàn)了,斧子不再由普通人完成,而在工廠里被生產(chǎn)出來(lái),此時(shí)需要斧子的人(調(diào)用者)找到工廠,購(gòu)買斧子,無(wú)須關(guān)心斧子的制造過(guò)程;對(duì)應(yīng)簡(jiǎn)單工廠設(shè)計(jì)模式,調(diào)用者只需定位工廠,無(wú)須管理被調(diào)用者的具體實(shí)現(xiàn)

進(jìn)入“共產(chǎn)主義”社會(huì),需要斧子的人甚至無(wú)須定位工廠,“坐等”社會(huì)提供即可;調(diào)用者無(wú)須關(guān)心被調(diào)用者的實(shí)現(xiàn),無(wú)須理會(huì)工廠,等待Spring依賴注入

二、設(shè)值注入

Person接口: public interface Person {   // 定義使用斧子的方法   public void useAxe(); } Spring推薦面向接口編程,這樣可更好地讓規(guī)范和實(shí)現(xiàn)分離,從而提供更好的解耦;對(duì)于一個(gè)Java EE應(yīng)用,不管是DAO組件還是業(yè)務(wù)邏輯組件,都應(yīng)該先定義一個(gè)接口,該接口定義了該組件應(yīng)實(shí)現(xiàn)的功能,但功能的實(shí)現(xiàn)則由其實(shí)現(xiàn)類提供 
Axe接口: public interface Axe {   // Axe接口里有個(gè)砍的方法   public String chop(); } 
實(shí)現(xiàn)Axe: public class StoneAxe implements Axe {   public String chop() {     return "石斧砍柴好慢S";   } } 

bean.xml: 

<?xml version="1.0" encoding="UTF-8"?> <!-- Spring配置文件的根元素,使用spring-beans-3.0.xsd語(yǔ)義約束 --> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns="http://www.springframework.org/schema/beans"  xsi:schemaLocation="http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">    <!-- 配置chinese實(shí)例 -->  <bean id="chinese" class="com.Chinese">    <!-- 將stoneAxe注入給axe屬性 -->    <property name="axe" ref="stoneAxe" />  </bean>    <!-- 配置stoneAxe實(shí)例 -->  <bean id="stoneAxe" class="com.StoneAxe" />   </beans> 

測(cè)試類: 

public class BeanTest {   public static void main(String[] args) {    // 創(chuàng)建Spring容器    ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");    // 獲取chinese實(shí)例    Person p = ctx.getBean("chinese", Person.class);    // 調(diào)用useAxe()方法    p.useAxe();   } } 

Spring采用XML作為配置文件,從Spring2.0開(kāi)始,Spring即可采用DTD來(lái)定義配置文件的語(yǔ)義約束,也可用XML Schema來(lái)定義(可利用Spring配置文件的擴(kuò)展性,進(jìn)一步簡(jiǎn)化Spring配置;還提供了一些新的標(biāo)簽;還允許程序員開(kāi)發(fā)自定義的配置文件標(biāo)簽,讓其他開(kāi)發(fā)人員在Spring配置文件中使用這些標(biāo)簽:通常由第三方供應(yīng)商完成);

可在Spring的projects目錄的org.springframwork.beans、org.springframework.context等目錄的/src/main/resources路徑下找到各種*.xsd文件(Spring配置文件的XML Schema語(yǔ)義約束文件)

在配置文件中,Spring配置Bean實(shí)例通常會(huì)指定:

id :指定該Bean的唯一標(biāo)識(shí),程序通過(guò)id屬性值來(lái)訪問(wèn)該Bean實(shí)例

class :指定該Bean的實(shí)現(xiàn)類, 此處不可再用接口 ,必須使用實(shí)現(xiàn)類Spring容器用XML解析器讀取該屬性,并利用反射來(lái)創(chuàng)建該實(shí)現(xiàn)類的實(shí)例

Spring會(huì)自動(dòng)接管每個(gè)<bean.../>定義里的<property.../>元素定義,Spring會(huì)在調(diào)用無(wú)參構(gòu)造器后、創(chuàng)建默認(rèn)Bean實(shí)例后、調(diào)用對(duì)應(yīng)的setter方法為程序注入屬性值

每個(gè)Bean的id屬性是該Bean的唯一標(biāo)識(shí),程序通過(guò)id屬性訪問(wèn)Bean,Bean與Bean的依賴關(guān)系也通過(guò)id屬性關(guān)聯(lián)

Bean與Bean間的依賴關(guān)系由Spring管理,Spring采用setter方法為目標(biāo)Bean注入所依賴的Bean,這種方式被稱為 設(shè)值注入

使用Spring IoC容器的3個(gè)基本要點(diǎn):

應(yīng)用程序的各組件面向接口編程

應(yīng)用程序的各組件不再由程序主動(dòng)產(chǎn)生,而是由Spring容器來(lái)負(fù)責(zé)產(chǎn)生、并初始化

Spring采用配置文件、或Annotation來(lái)管理Bean的實(shí)現(xiàn)類、依賴關(guān)系,Spring容器則根據(jù)配置文件、利用反射來(lái)創(chuàng)建實(shí)例,并為之注入依賴關(guān)系

三、構(gòu)造注入

在構(gòu)造實(shí)例時(shí),已經(jīng)為其完成了依賴關(guān)系的初始化。這種利用構(gòu)造器來(lái)設(shè)置依賴關(guān)系的方式,被稱為構(gòu)造注入

public class Chinese implements Person {  private Axe axe;    // 默認(rèn)的構(gòu)造器  public Chinese() {  }    // 構(gòu)造注入所需的帶參數(shù)的構(gòu)造器  public Chinese(Axe axe) {    this.axe = axe;  }    // 實(shí)現(xiàn)Person接口的useAxe方法  @Override  public void useAxe() {    // 調(diào)用axe的chop()方法    // 表明Person對(duì)象依賴于axe對(duì)象    System.out.println(axe.chop());  } } 

無(wú)須再提供設(shè)置axe屬性的setter方法,僅僅提供了一個(gè)帶Axe屬性的構(gòu)造器,Spring將通過(guò)該構(gòu)造器為chinese注入所依賴的Bean實(shí)例 

<?xml version="1.0" encoding="UTF-8"?> <!-- Spring配置文件的根元素,使用spring-beans-3.0.xsd語(yǔ)義約束 --> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns="http://www.springframework.org/schema/beans"  xsi:schemaLocation="http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">    <!-- 配置chinese實(shí)例 -->  <bean id="chinese" class="com.Chinese">    <!-- 使用構(gòu)造注入,為chinese實(shí)例注入stoneAxe實(shí)例 -->    <constructor-arg ref="stoneAxe" />  </bean>    <!-- 配置stoneAxe實(shí)例 -->  <bean id="stoneAxe" class="com.StoneAxe" />   </beans> 

<constructor-arg.../>元素指定了一個(gè)構(gòu)造器參數(shù),該參數(shù)類型是Axe,這指定Spring調(diào)用Chinese類里帶一個(gè)Axe參數(shù)的構(gòu)造器來(lái)創(chuàng)建chinese實(shí)例,因?yàn)槭褂昧擞袇?shù)的構(gòu)造器創(chuàng)建實(shí)例,所以當(dāng)Bean實(shí)例被創(chuàng)建完成后,該Bean的依賴關(guān)系已經(jīng)設(shè)置完成

配置<constructor-arg.../>元素時(shí)可指定一個(gè)index屬性,用于指定該構(gòu)造參數(shù)值將作為第幾個(gè)構(gòu)造參數(shù)值;如index=“0”表明該構(gòu)造參數(shù)值將作為第一個(gè)構(gòu)造參數(shù)

執(zhí)行效果與使用設(shè)置注入時(shí)的執(zhí)行效果完全一樣。區(qū)別在于:創(chuàng)建Person實(shí)例中Axe屬性的時(shí)機(jī)不同-----設(shè)置注入是先通過(guò)無(wú)參數(shù)的構(gòu)造器創(chuàng)建一個(gè)Bean實(shí)例,然后調(diào)用對(duì)應(yīng)的setter方法注入依賴關(guān)系;而構(gòu)造注入則直接調(diào)用有參數(shù)的構(gòu)造器,當(dāng)Bean實(shí)例創(chuàng)建完成后,已經(jīng)完成了依賴關(guān)系的注入

四、兩種注入方式的對(duì)比

相比之下,設(shè)值注入有如下優(yōu)點(diǎn):

與傳統(tǒng)的JavaBean的寫(xiě)法更相似,程序開(kāi)發(fā)人員更容易理解、接受、通過(guò)setter方法設(shè)定依賴關(guān)系顯得更加直觀、自然

對(duì)于復(fù)雜的依賴關(guān)系,若采用構(gòu)造注入,會(huì)導(dǎo)致構(gòu)造器過(guò)于臃腫,難以閱讀;Spring在創(chuàng)建Bean實(shí)例時(shí),需同時(shí)實(shí)例化其依賴的全部實(shí)例,因而導(dǎo)致性能下降

尤其是在某些屬性可選的情況下,多參數(shù)的構(gòu)造器更加笨重

相比之下,構(gòu)造注入有如下優(yōu)點(diǎn):

可在構(gòu)造器中決定依賴關(guān)系的注入順序,優(yōu)先依賴的優(yōu)先注入

對(duì)于依賴關(guān)系無(wú)需變化的Bean,構(gòu)造注入更有用處;因?yàn)闆](méi)有setter方法,所有的依賴關(guān)系全部在構(gòu)造器內(nèi)設(shè)定。因此,無(wú)須擔(dān)心后續(xù)的代碼對(duì)依賴關(guān)系產(chǎn)生破壞

依賴關(guān)系只能在構(gòu)造器設(shè)定,則只有組件的創(chuàng)建者才能改變組件的依賴關(guān)系。對(duì)組件的調(diào)用者而言,組件內(nèi)部的依賴關(guān)系完全透明,更符合高內(nèi)聚的原則

一般采用以設(shè)值注入為主,構(gòu)造注入為輔的注入策略。對(duì)于依賴關(guān)系無(wú)須變化的注入,盡量采用構(gòu)造注入;而其他的依賴關(guān)系的注入,則考慮設(shè)值注入

 如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JSP教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 成片免费观看大全 | 欧美成人精品一级 | 香蕉成人在线观看 | a免费视频 | 嫩呦国产一区二区三区av | 91专区在线观看 | 久久国产中文 | 澳门一级淫片免费视频 | 在线成人免费av | 久久中文一区 | 久久男人 | 成年人激情在线 | 日本在线观看视频网站 | 日韩欧美激情视频 | 草久视频在线观看 | 91精品国产免费久久 | 草久影院| 国产pron | 久久中文一区 | 欧美videofree性欧美另类 | 欧美性生活区 | 天天鲁在线视频免费观看 | 成人视屏在线观看 | 久久久久久久久浪潮精品 | 中文字幕综合在线观看 | 国产精品视频一区二区三区综合 | 久久国产一级 | 日韩美香港a一级毛片 | 国产毛片网站 | 国产精品久久久久久模特 | 99视频有精品| 国产午夜免费不卡精品理论片 | 亚洲精品无码不卡在线播放he | 日本中文字幕电影在线观看 | 蜜桃麻豆视频 | 成人综合一区二区 | 性爱视频免费 | 中文字幕xxx | 国产精品久久久久久久久久了 | 麻豆小视频在线观看 | 视频在线91|