成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

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

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

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

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

一、理解依賴注入

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

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

依賴注入

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

構造注入:IoC容器使用構造器來注入被依賴的實例

理解依賴注入:

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

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

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

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

二、設值注入

Person接口: 
public interface Person { 
  // 定義使用斧子的方法 
  public void useAxe(); 
} 
Spring推薦面向接口編程,這樣可更好地讓規范和實現分離,從而提供更好的解耦;對于一個Java EE應用,不管是DAO組件還是業務邏輯組件,都應該先定義一個接口,該接口定義了該組件應實現的功能,但功能的實現則由其實現類提供 
Axe接口: 
public interface Axe { 
  // Axe接口里有個砍的方法 
  public String chop(); 
} 
實現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) { 
   // 創建Spring容器 
   ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml"); 
   // 獲取chinese實例 
   Person p = ctx.getBean("chinese", Person.class); 
   // 調用useAxe()方法 
   p.useAxe(); 
  } 
} 

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

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

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

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

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

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

每個Bean的id屬性是該Bean的唯一標識,程序通過id屬性訪問Bean,Bean與Bean的依賴關系也通過id屬性關聯

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

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

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

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

Spring采用配置文件、或Annotation來管理Bean的實現類、依賴關系,Spring容器則根據配置文件、利用反射來創建實例,并為之注入依賴關系

三、構造注入

在構造實例時,已經為其完成了依賴關系的初始化。這種利用構造器來設置依賴關系的方式,被稱為構造注入

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

無須再提供設置axe屬性的setter方法,僅僅提供了一個帶Axe屬性的構造器,Spring將通過該構造器為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"> 
   <!-- 使用構造注入,為chinese實例注入stoneAxe實例 --> 
   <constructor-arg ref="stoneAxe" /> 
 </bean> 
  
 <!-- 配置stoneAxe實例 --> 
 <bean id="stoneAxe" /> 
  
</beans> 

<constructor-arg.../>元素指定了一個構造器參數,該參數類型是Axe,這指定Spring調用Chinese類里帶一個Axe參數的構造器來創建chinese實例,因為使用了有參數的構造器創建實例,所以當Bean實例被創建完成后,該Bean的依賴關系已經設置完成

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

執行效果與使用設置注入時的執行效果完全一樣。區別在于:創建Person實例中Axe屬性的時機不同-----設置注入是先通過無參數的構造器創建一個Bean實例,然后調用對應的setter方法注入依賴關系;而構造注入則直接調用有參數的構造器,當Bean實例創建完成后,已經完成了依賴關系的注入

四、兩種注入方式的對比

相比之下,設值注入有如下優點:

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

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

尤其是在某些屬性可選的情況下,多參數的構造器更加笨重

相比之下,構造注入有如下優點:

可在構造器中決定依賴關系的注入順序,優先依賴的優先注入

對于依賴關系無需變化的Bean,構造注入更有用處;因為沒有setter方法,所有的依賴關系全部在構造器內設定。因此,無須擔心后續的代碼對依賴關系產生破壞

依賴關系只能在構造器設定,則只有組件的創建者才能改變組件的依賴關系。對組件的調用者而言,組件內部的依賴關系完全透明,更符合高內聚的原則

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

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

標簽: JSP
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
日韩女优毛片在线| 久久99精品久久久久久久久久久久| 性久久久久久久久| 精品1区2区| 国产欧美日韩另类一区| 国产99精品在线观看| 91精品国产综合久久小美女| 精品在线免费观看| 欧美日韩另类一区| 国产精品原创巨作av| 91精品国产综合久久久蜜臀粉嫩| 六月丁香婷婷久久| 欧美日韩视频在线一区二区| 久久av中文字幕片| 欧美精品成人一区二区三区四区| 国产一区二区按摩在线观看| 91精品国产色综合久久不卡蜜臀 | 亚洲免费资源在线播放| 韩日视频一区| 国产精品高潮呻吟| 在线看片欧美| 一区二区三区.www| 鲁大师影院一区二区三区| 日韩专区欧美专区| 色婷婷av一区二区三区软件| 麻豆国产精品777777在线| 欧美三级电影网| 国产高清不卡二三区| 日韩无一区二区| 91伊人久久大香线蕉| 国产日韩欧美制服另类| 国内精品国语自产拍在线观看| 亚洲欧洲日产国产综合网| 亚洲经典三级| 亚洲成人先锋电影| 欧美午夜理伦三级在线观看| 精品系列免费在线观看| 日韩一区二区在线看| 91丨九色丨蝌蚪丨老版| 中文字幕亚洲成人| 久久久999| 激情文学综合插| 精品国产制服丝袜高跟| 欧美成人有码| 亚洲综合精品自拍| 91久久精品一区二区三| 国产二区国产一区在线观看| 久久久午夜精品理论片中文字幕| 欧美性久久久| 亚洲成av人片在线观看| 欧美日韩免费不卡视频一区二区三区 | 国产精品婷婷午夜在线观看| 99re66热这里只有精品4| 日韩电影在线一区二区| 日韩一区二区三区av| 欧美午夜精品理论片a级大开眼界| 亚洲三级在线看| 在线亚洲一区二区| 国产91富婆露脸刺激对白| 国产精品美女久久久久久久久| 蜜桃久久av| 懂色av一区二区夜夜嗨| 日韩一区在线播放| 欧美综合天天夜夜久久| 99久久综合狠狠综合久久| 亚洲人成人一区二区在线观看 | 一区二区激情| 激情六月婷婷综合| 亚洲国产激情av| 乱人伦精品视频在线观看| 国内久久婷婷综合| 国产欧美在线观看一区| 亚洲主播在线| 国产成人av影院| 国产精品国产三级国产| 色综合久久久久久久久久久| 成人黄色综合网站| 亚洲国产中文字幕| 日韩一区二区在线观看视频| 亚洲国产第一| 国产精品一二二区| 成人欧美一区二区三区白人 | 国产盗摄一区二区三区| 国产精品盗摄一区二区三区| 欧美做爰猛烈大尺度电影无法无天| av在线免费不卡| 亚洲国产视频一区二区| 日韩欧美国产三级| 国产亚洲精品v| 成人综合在线网站| 亚洲小说春色综合另类电影| 337p粉嫩大胆噜噜噜噜噜91av| 亚洲一区欧美激情| 波多野结衣亚洲| 五月综合激情日本mⅴ| 久久久精品日韩欧美| 91黄色免费观看| 国产精品对白刺激久久久| 激情综合五月婷婷| 亚洲欧美色图小说| 日韩精品一区二区三区在线播放| 亚洲一区尤物| 欧美在线播放一区二区| 另类小说一区二区三区| 中文字幕一区二区在线播放| 欧美一区二区三区四区久久| 国产精品区免费视频| 99久久99久久精品免费观看 | 欧美一区二区在线| 久久成人18免费观看| 亚洲欧洲成人精品av97| 日韩欧美在线综合网| 免费看亚洲片| 国模吧视频一区| 国产.欧美.日韩| 日本欧美一区二区在线观看| 中文字幕免费观看一区| 91精品国产综合久久精品app| 国产一区二区三区高清| 91亚洲精品久久久蜜桃| 国模冰冰炮一区二区| 亚洲电影一区二区三区| 国产精品乱码妇女bbbb| 日韩欧美亚洲一区二区| 欧美怡红院视频| 国产精品亚洲一区| 午夜久久99| 国产福利一区二区| 日韩二区三区四区| 亚洲人成网站色在线观看| 久久久久久久免费视频了| 欧美精品18+| 色噜噜狠狠成人网p站| 在线亚洲一区| 激情自拍一区| 91一区二区三区在线播放| 国产精品77777| 六月丁香婷婷久久| 婷婷亚洲久悠悠色悠在线播放| 中文字幕中文在线不卡住| 久久久久久久综合色一本| 欧美一级在线观看| 在线看国产一区| 久久九九精品| 亚洲一区二区在| 99精品视频免费| 亚洲精品1区2区| 韩国av一区| 欧美午夜久久| 欧美日本一区二区高清播放视频| 成人av网站在线观看免费| 国产精品一区二区无线| 精品午夜一区二区三区在线观看| 日韩 欧美一区二区三区| 亚洲第一搞黄网站| 亚洲综合视频网| 亚洲激情综合网| 亚洲日本成人在线观看| 综合欧美亚洲日本| 国产精品大尺度| 国产精品久久久久影视| 中文无字幕一区二区三区| 国产亚洲精久久久久久| 久久久久亚洲蜜桃| 久久久久久久网| 国产亚洲成aⅴ人片在线观看| 久久日一线二线三线suv| xnxx国产精品| 久久一区二区三区四区| 久久免费的精品国产v∧| 久久先锋资源网| 久久夜色精品国产噜噜av | 欧美激情综合五月色丁香小说| 久久一区二区三区国产精品| 337p日本欧洲亚洲大胆色噜噜| 精品日本一线二线三线不卡| 欧美成人r级一区二区三区| 欧美成人伊人久久综合网| 精品久久人人做人人爰| 26uuu精品一区二区在线观看| 久久综合九色综合欧美98| 亚洲精品在线免费播放| 久久精品视频网| 国产精品国产a| 一区二区三区不卡视频在线观看| 一区二区三区中文在线| 亚洲一区二区三区四区在线观看 | 欧美一区二区成人6969| 精品国产成人在线影院| 国产欧美日韩精品一区| 中文字幕一区二区不卡| 一区二区高清免费观看影视大全| 性感美女极品91精品| 毛片不卡一区二区| 国产精品一区久久久久| 99免费精品在线| 亚洲经典在线看| 国产农村妇女毛片精品久久莱园子| 久久久成人网| 7777女厕盗摄久久久|