婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識(shí)庫(kù) > 詳解Spring的核心機(jī)制依賴注入

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

熱門標(biāo)簽:如何看懂地圖標(biāo)注點(diǎn) 南通通訊外呼系統(tǒng)產(chǎn)品介紹 電話機(jī)器人需要使用網(wǎng)絡(luò)嗎 潤(rùn)滑油銷售電銷機(jī)器人 電銷機(jī)器人免培訓(xùn) 海外圖書館地圖標(biāo)注點(diǎn) 給地圖標(biāo)注得傭金 自繪地圖標(biāo)注數(shù)據(jù) 外呼系統(tǒ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)用者來完成,因此稱為 控制反轉(zhuǎn) ;創(chuàng)建被調(diào)用者實(shí)例的工作通常由Spring容器來完成,然后注入調(diào)用者,因此也稱為 依賴注入

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

依賴注入

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

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

理解依賴注入:

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

在原始社會(huì)里,幾乎沒有社會(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)出來,此時(shí)需要斧子的人(調(diào)用者)找到工廠,購(gòu)買斧子,無須關(guān)心斧子的制造過程;對(duì)應(yīng)簡(jiǎn)單工廠設(shè)計(jì)模式,調(diào)用者只需定位工廠,無須管理被調(diào)用者的具體實(shí)現(xiàn)

進(jìn)入“共產(chǎn)主義”社會(huì),需要斧子的人甚至無須定位工廠,“坐等”社會(huì)提供即可;調(diào)用者無須關(guān)心被調(diào)用者的實(shí)現(xiàn),無須理會(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語義約束 --> 
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開始,Spring即可采用DTD來定義配置文件的語義約束,也可用XML Schema來定義(可利用Spring配置文件的擴(kuò)展性,進(jìn)一步簡(jiǎn)化Spring配置;還提供了一些新的標(biāo)簽;還允許程序員開發(fā)自定義的配置文件標(biāo)簽,讓其他開發(fā)人員在Spring配置文件中使用這些標(biāo)簽:通常由第三方供應(yīng)商完成);

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

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

id :指定該Bean的唯一標(biāo)識(shí),程序通過id屬性值來訪問該Bean實(shí)例

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

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

每個(gè)Bean的id屬性是該Bean的唯一標(biāo)識(shí),程序通過id屬性訪問Bean,Bean與Bean的依賴關(guān)系也通過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容器來負(fù)責(zé)產(chǎn)生、并初始化

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

三、構(gòu)造注入

在構(gòu)造實(shí)例時(shí),已經(jīng)為其完成了依賴關(guān)系的初始化。這種利用構(gòu)造器來設(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()); 
 } 
} 

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

?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實(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)造器來創(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è)置注入是先通過無參數(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的寫法更相似,程序開發(fā)人員更容易理解、接受、通過setter方法設(shè)定依賴關(guān)系顯得更加直觀、自然

對(duì)于復(fù)雜的依賴關(guān)系,若采用構(gòu)造注入,會(huì)導(dǎo)致構(gòu)造器過于臃腫,難以閱讀;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)系無需變化的Bean,構(gòu)造注入更有用處;因?yàn)闆]有setter方法,所有的依賴關(guān)系全部在構(gòu)造器內(nèi)設(shè)定。因此,無須擔(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)系無須變化的注入,盡量采用構(gòu)造注入;而其他的依賴關(guān)系的注入,則考慮設(shè)值注入

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

您可能感興趣的文章:
  • 詳解Java Spring各種依賴注入注解的區(qū)別
  • Spring 依賴注入的幾種方式詳解
  • Spring依賴注入的兩種方式(根據(jù)實(shí)例詳解)
  • 理解Spring中的依賴注入和控制反轉(zhuǎn)
  • Spring循環(huán)依賴正確性及Bean注入的順序關(guān)系詳解
  • Spring依賴注入的三種方式小結(jié)
  • Spring依賴注入的三種方式實(shí)例詳解
  • Spring學(xué)習(xí)之依賴注入的方法(三種)
  • 如何簡(jiǎn)單的理解依賴注入詳解

標(biāo)簽:樂山 南京 內(nèi)江 黃石 大連 廣州 銅川 貸款邀約

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解Spring的核心機(jī)制依賴注入》,本文關(guān)鍵詞  詳解,Spring,的,核心,機(jī)制,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《詳解Spring的核心機(jī)制依賴注入》相關(guān)的同類信息!
  • 本頁收集關(guān)于詳解Spring的核心機(jī)制依賴注入的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲综合视频在线| 国内精品视频666| 奇米在线7777在线精品| 国产精品一区二区三区99| 在线亚洲高清视频| 中文字幕一区在线观看| 麻豆免费精品视频| 欧美日韩亚洲国产综合| 亚洲三级电影全部在线观看高清| 免费成人av在线播放| 日本道色综合久久| 国产精品理论在线观看| 国产馆精品极品| 欧美mv日韩mv| 人人精品人人爱| 欧美日韩国产小视频在线观看| 国产精品久久久久久一区二区三区| 麻豆久久一区二区| 欧美成人猛片aaaaaaa| 日韩影院精彩在线| 日韩一级片在线观看| 日韩精品欧美精品| 91精品国产乱码久久蜜臀| 亚洲成a人片在线观看中文| 在线中文字幕不卡| 亚洲精品福利视频网站| 91美女蜜桃在线| 一区二区三区小说| 在线观看日韩电影| 亚洲成人免费在线| 7777精品伊人久久久大香线蕉完整版 | 国产一区激情在线| 亚洲精品一区二区三区福利| 狠狠色综合色综合网络| 欧美精品一区二区在线播放| 国产综合久久久久久鬼色| 精品久久久久香蕉网| 国产一区免费电影| 国产欧美精品在线观看| 成人不卡免费av| 亚洲综合丁香婷婷六月香| 欧美视频第二页| 午夜精品久久久久久久99水蜜桃| 8v天堂国产在线一区二区| 精品一区二区三区在线观看| 久久久精品天堂| 99精品国产99久久久久久白柏| 亚洲精品伦理在线| 欧美午夜精品理论片a级按摩| 日韩精品一级中文字幕精品视频免费观看 | 亚洲欧美另类小说| 欧美亚洲精品一区| 美国毛片一区二区| 国产精品美女久久久久aⅴ| 91天堂素人约啪| 日韩成人精品视频| 久久嫩草精品久久久久| 91在线观看视频| 日韩精品一二三| 国产精品全国免费观看高清 | 亚洲一区二区三区四区不卡| 欧美精品一卡二卡| 国产98色在线|日韩| 亚洲一二三区在线观看| 精品国产凹凸成av人导航| 99精品久久只有精品| 免费精品视频在线| 亚洲美女屁股眼交3| 欧美成人欧美edvon| 91精品福利视频| 国产成人精品亚洲日本在线桃色 | 亚洲视频一区二区在线观看| 欧美日高清视频| 国产一区二区三区在线看麻豆| 亚洲欧洲精品天堂一级 | 成人精品gif动图一区| 亚洲电影视频在线| 国产精品久久夜| 日韩欧美在线不卡| 日本精品一区二区三区四区的功能| 美日韩一级片在线观看| 伊人性伊人情综合网| 久久精品免费在线观看| 欧美一区二区三区免费视频| jiyouzz国产精品久久| 国产一区二区三区在线观看免费视频| 午夜久久久影院| 国产精品国模大尺度视频| 2020日本不卡一区二区视频| 欧美日韩国产影片| 色综合久久中文综合久久牛| 成人一级黄色片| 国产成人在线免费| 国产一区三区三区| 精品在线免费观看| 青青草91视频| 日韩av电影一区| 视频一区在线播放| 天天色 色综合| 五月婷婷综合在线| 亚洲va欧美va人人爽| 亚洲综合一区二区三区| 亚洲欧美成人一区二区三区| 国产精品卡一卡二| 国产精品久久久久7777按摩| 国产欧美日本一区视频| 久久久久久久久久久电影| 精品久久久久久最新网址| 日韩精品一区二区三区三区免费| 欧美一区二区视频在线观看2022| 678五月天丁香亚洲综合网| 欧美日韩日日骚| 91精品蜜臀在线一区尤物| 日韩丝袜美女视频| 久久久99免费| 国产精品天美传媒沈樵| 国产精品水嫩水嫩| 国产精品久久久久9999吃药| 一色桃子久久精品亚洲| 亚洲女爱视频在线| 亚洲sss视频在线视频| 日韩中文字幕91| 黄色日韩网站视频| 国产suv精品一区二区883| 成人v精品蜜桃久久一区| 色就色 综合激情| 日韩一区二区三区在线| 精品久久久久香蕉网| 国产精品区一区二区三区| 一区二区三区中文字幕| 日韩av一区二区三区| 国产一区二区免费看| 成人福利在线看| 欧美美女一区二区三区| 精品国产乱码久久| 亚洲精品你懂的| 蜜臀精品一区二区三区在线观看| 激情亚洲综合在线| 99国产麻豆精品| 91精品国产麻豆国产自产在线| 久久久久国产成人精品亚洲午夜| 亚洲视频每日更新| 日韩电影网1区2区| 不卡一二三区首页| 日韩一级片在线观看| 中文字幕在线观看不卡视频| 丝袜美腿高跟呻吟高潮一区| 成人免费视频播放| 日韩一区二区影院| 亚洲蜜臀av乱码久久精品蜜桃| 天天色天天操综合| av亚洲精华国产精华精| 欧美肥大bbwbbw高潮| 国产精品午夜免费| 久久66热re国产| 欧美影视一区在线| 亚洲国产精品av| 日韩av不卡在线观看| 99精品热视频| 国产欧美日韩精品在线| 五月天丁香久久| 色综合久久88色综合天天免费| 久久综合久久综合亚洲| 天堂va蜜桃一区二区三区 | 亚洲午夜激情网页| 成人激情小说乱人伦| 欧美电影免费观看高清完整版在线 | 激情文学综合丁香| 制服.丝袜.亚洲.中文.综合| 亚洲免费在线视频| 北条麻妃一区二区三区| 2020国产精品自拍| 男女性色大片免费观看一区二区| 99国产精品久久| 亚洲国产成人在线| 国产成人精品免费在线| 日韩精品一区二区三区蜜臀| 石原莉奈一区二区三区在线观看 | 成人免费黄色大片| 久久综合九色欧美综合狠狠| 麻豆精品视频在线观看| 日韩一区二区高清| 免费成人结看片| 精品蜜桃在线看| 精品系列免费在线观看| 69久久夜色精品国产69蝌蚪网| 婷婷久久综合九色综合绿巨人 | 7777精品伊人久久久大香线蕉经典版下载| **性色生活片久久毛片| 不卡欧美aaaaa| 最好看的中文字幕久久| 97国产一区二区| 亚洲一区二区三区四区在线| 欧美性大战久久久久久久| 亚洲国产另类av| 日韩视频一区二区三区在线播放| 蜜臀av一级做a爰片久久| 日韩一级免费一区| 国产精品一区二区不卡| 国产日韩欧美在线一区|