亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

詳解Spring的核心機制依賴注入

瀏覽:47日期:2022-06-07 09:02:54

詳解Spring的核心機制依賴注入

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

一、理解依賴注入

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

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

依賴注入

設值注入:IoC容器使用屬性的setter方法來注入被依賴的實例

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

理解依賴注入:

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

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

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

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

二、設值注入

Person接口: 
public interface Person { 
  // 定義使用斧子的方法 
  public void useAxe(); 
} 
Spring推薦面向接口編程,這樣可更好地讓規(guī)范和實現(xiàn)分離,從而提供更好的解耦;對于一個Java EE應用,不管是DAO組件還是業(yè)務邏輯組件,都應該先定義一個接口,該接口定義了該組件應實現(xiàn)的功能,但功能的實現(xiàn)則由其實現(xiàn)類提供 
Axe接口: 
public interface Axe { 
  // Axe接口里有個砍的方法 
  public String chop(); 
} 
實現(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語義約束 --> 
<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實例 --> 
 <bean id="chinese"> 
   <!-- 將stoneAxe注入給axe屬性 --> 
   <property name="axe" ref="stoneAxe" /> 
 </bean> 
  
 <!-- 配置stoneAxe實例 --> 
 <bean id="stoneAxe" /> 
  
</beans> 

測試類: 

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

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

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

在配置文件中,Spring配置Bean實例通常會指定:

id :指定該Bean的唯一標識,程序通過id屬性值來訪問該Bean實例

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

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

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

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

使用Spring IoC容器的3個基本要點:

應用程序的各組件面向接口編程

應用程序的各組件不再由程序主動產(chǎn)生,而是由Spring容器來負責產(chǎn)生、并初始化

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

三、構(gòu)造注入

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

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

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

<?xml version="1.0" encoding="UTF-8"?> 
<!-- Spring配置文件的根元素,使用spring-beans-3.0.xsd語義約束 --> 
<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實例 --> 
 <bean id="chinese"> 
   <!-- 使用構(gòu)造注入,為chinese實例注入stoneAxe實例 --> 
   <constructor-arg ref="stoneAxe" /> 
 </bean> 
  
 <!-- 配置stoneAxe實例 --> 
 <bean id="stoneAxe" /> 
  
</beans> 

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

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

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

四、兩種注入方式的對比

相比之下,設值注入有如下優(yōu)點:

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

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

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

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

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

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

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

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

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

標簽: JSP
相關(guān)文章:
主站蜘蛛池模板: 制服丝袜综合第八页 | 亚洲你xx我xx网站 | 亚洲视频国产 | 在线精品自拍亚洲第一区 | 狠狠操精品视频 | 免费观看国产精品视频 | 自拍视频网址 | 日本久久一区二区 | 日韩免费观看 | 狠狠色噜噜狠狠狠狠狠色综合久久 | 亚洲第一页在线观看 | 国产1区二区 | 狠狠插影院 | 老头做爰xxxx视频 | 国产免费又色又爽又黄的网站 | 国产综合久久久久 | 免费看黄网址 | 国产成人综合网在线观看 | 黄色网址在线免费看 | a级毛片免费全部播放 | bbixx在线观看| 国产日韩欧美三级 | 成人禁啪啪网站 | 欧美激情毛片 | 国内真实愉拍系列情侣自拍 | 亚洲人成在线观看男人自拍 | 午夜影院欧美 | 国产成人精品高清不卡在线 | 国产在线精品二区韩国演艺界 | 国产欧美自拍 | 亚洲激情中文字幕 | 美国一级做a一级视频 | 日本特黄特色大片免费视频观看 | 国产日韩欧美精品 | 亚洲一级毛片在线观播放 | 久久亚洲国产精品 | 成人欧美一区二区三区在线 | 6080亚洲精品一区 | 成年1314在线观看 | 亚洲免费看片 | 亚洲综合成人网在线观看 |