亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

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

2024-09-05 00:23:30
字體:
供稿:網(wǎng)友

詳解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):當(dāng)某個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)系的管理

依賴注入

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

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

理解依賴注入:

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

在原始社會里,幾乎沒有社會分工;需要斧子的人(調(diào)用者)只能自己去磨一把斧子(被調(diào)用者);對應(yīng)情形為: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)心斧子的制造過程;對應(yīng)簡單工廠設(shè)計模式,調(diào)用者只需定位工廠,無須管理被調(diào)用者的具體實現(xiàn)

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

二、設(shè)值注入

Person接口: public interface Person {   // 定義使用斧子的方法   public void useAxe(); } Spring推薦面向接口編程,這樣可更好地讓規(guī)范和實現(xiàn)分離,從而提供更好的解耦;對于一個Java EE應(yīng)用,不管是DAO組件還是業(yè)務(wù)邏輯組件,都應(yīng)該先定義一個接口,該接口定義了該組件應(yīng)實現(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" class="com.Chinese">    <!-- 將stoneAxe注入給axe屬性 -->    <property name="axe" ref="stoneAxe" />  </bean>    <!-- 配置stoneAxe實例 -->  <bean id="stoneAxe" class="com.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配置文件中使用這些標簽:通常由第三方供應(yīng)商完成);

可在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)用對應(yīng)的setter方法為程序注入屬性值

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

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

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

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

應(yīng)用程序的各組件不再由程序主動產(chǎn)生,而是由Spring容器來負責(zé)產(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)造器來設(shè)置依賴關(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());  } } 

無須再提供設(shè)置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" class="com.Chinese">    <!-- 使用構(gòu)造注入,為chinese實例注入stoneAxe實例 -->    <constructor-arg ref="stoneAxe" />  </bean>    <!-- 配置stoneAxe實例 -->  <bean id="stoneAxe" class="com.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)建實例,所以當(dāng)Bean實例被創(chuàng)建完成后,該Bean的依賴關(guān)系已經(jīng)設(shè)置完成

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

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

四、兩種注入方式的對比

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

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

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

尤其是在某些屬性可選的情況下,多參數(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)設(shè)定。因此,無須擔(dān)心后續(xù)的代碼對依賴關(guān)系產(chǎn)生破壞

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

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

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


注:相關(guān)教程知識閱讀請移步到JSP教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
国产美女视频网站| 特级西西444www高清大视频| 国产精品69精品一区二区三区| 91麻豆精品久久毛片一级| 91小视频免费看| 羞羞答答成人影院www| 欧美日韩亚洲综合一区| 国产精品精品软件视频| 国产男女无套免费网站| 黄色av网站在线免费观看| 亚洲国产精品欧美久久| 成人av激情人伦小说| 国产mv日韩mv欧美| 美女禁区视频免费观看精选| 精品国产乱码一区二区三区| 99视频在线观看免费| 西西大胆午夜视频| 性感美女一级片| 91综合久久| 国产三级欧美三级日产三级99| 久久黄色一级视频| va天堂va亚洲va影视| 欧美日溪乱毛片| 亚洲一区二区三区自拍| 成人精品亚洲人成在线| 日本一区二区在线视频| 中文字幕一区二区三区中文字幕| 国产精品入口尤物| 国产精品我不卡| 亚洲av成人精品日韩在线播放| 国产黄色一级大片| 亚洲最大激情网| 日韩在线xxx| 国产精品91一区二区| 国产精品久99| 黄色av电影在线观看| 亚洲在线资源| 无码一区二区三区在线观看| 欧美精品少妇一区二区三区| 亚洲一区二区美女| 日韩一级片免费视频| 欧美一级色片| 国产一级在线观看www色| 国产精品一在线观看| 久久久久久久免费视频了| 中文字幕一区三区久久女搜查官| 亚洲美女黄网| 成人免费在线视频网| 亚洲天堂网在线观看视频| 青青青草原在线| 91香蕉视频黄| 黄网在线观看网址入口| 亚洲人成人77777线观看| 国产精品视频网| 久久亚洲国产成人精品性色| 国产清纯美女被跳蛋高潮一区二区久久w| 国产sm主人调教女m视频| 久久久久久久久久久久久女国产乱| 黄色国产精品一区二区三区| 972aa.com艺术欧美| 国内在线免费视频| 小草在线视频免费播放| 亚洲成年人专区| 国产精品久久久精品a级小说| 中文字幕亚洲一区在线观看| 成人av在线一区二区| 欧美岛国在线观看| 高清视频一区二区| 中文字幕日产av| 欧美午夜一区| 在线观看一区视频| 一区二区三区国产在线观看| 亚洲影视一区| 欧美xxxx黑人xyx性爽| 中文字幕精品无码一区二区| 欧美日韩中文在线观看| 国产一级大片在线观看| 亚洲激情六月丁香| 日韩电影免费网站| 亚洲国产视频在线| 国产电影一区二区在线观看| 国产一级粉嫩xxxx| 国产日韩在线精品av| 在线视频1区| 久久久亚洲成人| 国产精品传媒毛片三区| 国产成人精品av久久| 手机av免费看| 波多野结衣一区二区三区在线观看| 免费一级特黄特色毛片久久看| 中文字幕亚洲欧美| 爱福利视频一区二区| 亚洲精品怡红院| 国产蜜臀97一区二区三区| 自拍偷拍欧美日韩| 97视频在线观看播放| 99精品全国免费观看视频软件| 欧美高清在线视频观看不卡| av不卡中文字幕| 污片视频在线免费观看| 最近更新的2019中文字幕| 精品成人a区在线观看| 国产农村妇女毛片精品久久莱园子| 日本黄色录像视频| 国产传媒在线播放| 亚洲精品一区二区三区蜜桃久| 好看的日韩av电影| 成人免费公开视频| 欧美一区二区三区在线视频| 午夜免费视频在线国产| 国产99精品在线观看| 九九**精品视频免费播放| 日韩av色综合| 精品国产av无码一区二区三区| 在线免费看a| 一级特黄aaaaaa大片| 欧美性猛交xxxx偷拍洗澡| 亚洲精品日韩综合观看成人91| 亚洲美女屁股眼交| 欧美独立站高清久久| 久草在线视频资源| 精品无码人妻一区| 亚洲AV无码片久久精品| 日韩少妇内射免费播放18禁裸乳| 国产成人精选| 97成人在线观看| 久久久夜精品| 国产三级欧美三级| 国产一级片播放| 亚洲综合激情在线| 欧美成人乱码一二三四区免费| 非洲黑人最猛性xxxx交| 久久久成人精品一区二区三区| 一本久道综合久久精品| 久久精品亚洲精品国产欧美kt∨| 亚洲一区站长工具| 国产欧美熟妇另类久久久| 国产精品久久久久一区二区三区| vam成人资源在线观看| 日日噜噜噜噜久久久精品毛片| 1024亚洲合集| 欧美一级手机免费观看片| 色偷偷av男人的天堂| 91免费版网站入口| 在线欧美日韩精品| 中国xxxx性xxxx产国| 久久久精品一区二区涩爱| www.蜜臀av| 日韩av中文字幕在线播放| 亚洲a区在线视频| 国产男男gay体育生网站| 国产日产精品一区二区三区四区的观看方式| 色婷婷综合久久| 日本视频三区| 99视频在线免费观看| 久久国产夜色精品鲁鲁99| 97在线免费观看| 日本免费一区二区三区视频| 日韩av资源在线播放| 欧美黄页免费| 波多野结衣家庭教师视频| 日韩加勒比系列| 亚洲同志网站入口| 在线天堂中文字幕| av污在线观看| 久久精品色欧美aⅴ一区二区| 可以在线观看的黄色网址| www.com黄色片| 在线观看国产精品入口男同| 伊人久久大香线蕉综合影院首页| 最近中文字幕免费视频| 四虎影视1304t| 免费成人进口网站| 亚洲一区精品视频| 国模吧视频一区| 日韩精品黄色| 免费看成人av| 日本午夜精品电影| 日韩精品――色哟哟| av网站导航在线观看免费| 国产一区二区三区亚洲| 亚洲做受高潮无遮挡| 久久久久久久久久久久久久久久久久久久| 欧美三级电影在线看| 欧美老女人在线视频| 色视频一区二区三区| 欧美区一区二| 国产一级一区二区| 影音先锋在线影院| 无码人妻精品一区二区三区蜜桃91| 91一区二区视频| 国产精品18久久久久久麻辣| 天天干天天操天天操| www.日韩精品| 欧美啪啪网站| 日韩欧美一区二区三区在线视频| 国产成人夜间影院在线观看| 天天色天天看| 日本精品一区二区三区高清 久久| 高清在线观看免费| 亚洲欧美综合另类| 精品午夜久久福利影院| 色先锋aa成人| 国产成人免费高清| 亚洲xxxx视频| 四虎永久免费观看| 亚洲国产日韩在线| 麻豆91在线播放| 亚洲国产精品久久网午夜小说| 无码人妻精品一区二区蜜桃网站| 六月婷婷中文字幕| 日韩av最新在线| 国产一区红桃视频| 热re99久久精品国产66热| 日本中文字幕视频在线| 激情视频免费网站| 欧美成人片在线观看| 99久久精品免费观看国产| 亚洲精品少妇30p| 婷婷丁香久久五月婷婷| 黄色免费在线观看网站| 国产亚洲精品中文字幕| 国产黑丝在线一区二区三区| 99视频在线免费播放| 欧美v在线观看| 亚洲午夜国产成人| 亚洲精品99久久久久| 免费黄色av电影| 黄色a一级视频| eeuss影院一区二区三区| 欧美最猛性xxxxx免费| 国产精品亚洲欧美日韩一区在线| 韩日中文字幕| 欧美激情视频免费看| 国产精品不卡av| 99国产精品久久| 一区二区三区成人在线视频| 激情小说综合区| 久久久久久免费| 成人福利免费在线观看| 久久视频这里有精品| 狂野欧美性猛交| 欧洲一区二区三区在线| 日韩免费中文字幕| aaa亚洲精品一二三区| aa日韩免费精品视频一| 国产麻豆精品久久一二三| 国产ktv在线视频| 欧美日韩怡红院| av不卡免费在线观看| 老司机性视频| 日韩欧美亚洲v片| 波多结衣在线观看| 中文视频一区视频二区视频三区| 成人黄色免费在线观看| 欧美日韩三级电影在线| 午夜大尺度福利视频| 日韩精品dvd| 综合久久成人| 国产精品视频免费播放| 欧美日韩经典丝袜| 亚洲图片欧美另类| 捆绑调教日本一区二区三区| 99aiav| 中国黄色片视频| 日韩精品四区| 视频一区视频二区视频| 2019国产精品自在线拍国产不卡| 先锋资源在线视频| 日夜干在线视频| 亚洲一区免费网站| 国产精品第三页| 日韩你懂的在线播放| 中文字幕av日韩精品| 亚洲国产日韩精品| 乱一区二区三区在线播放| 91热视频在线观看| 推川ゆうり中文亚洲二区| 欧美精品在线一区二区| 国产精品不卡一区二区三区在线观看| 亚洲三级小视频| 97精品视频在线播放| l8videosex性欧美69| 三上悠亚在线一区| 国产精品久久在线观看| 美女搡bbb又爽又猛又黄www| 在线黄色免费网站| www.操操操.com| 精品中文字幕在线2019| 成人免费播放视频| 草裙成人精品一区二区三区| 天堂在线网站| 粉嫩av懂色av蜜臀av分享| 影音先锋成人在线电影| 国产成人在线观看免费网站| 经典一区二区三区| 日韩在线观看av| 影音先锋中文资源站| 亚洲国产综合在线观看| 美女不穿衣服的网站| 久久一卡二卡| 亚洲精品久久久久久动漫器材一区| 国产在线视频2019最新视频| 99热一区二区三区| 九九热精品视频在线观看| 欧美日韩精品欧美日韩精品一| 久久国产精品1区2区3区网页| 国产亚洲欧美一区二区三区| 免费在线观看亚洲视频| 国产精品密蕾丝视频下载| 99久久婷婷国产综合精品首页| 九九热r在线视频精品| 久久伊人精品一区二区三区| 中文人妻一区二区三区| 欧美精品久久久久久久小说| 影音先锋在线播放| 成人免费视频在线观看超级碰| 韩国三级hd中文字幕有哪些| 国产精品扒开腿做爽爽爽a片唱戏| 国产性猛交普通话对白| 精品福利影院| 99热在线观看免费| 国产美女免费视频| 久久99热精品这里久久精品| h片在线观看视频免费免费| 日韩一区二区三区免费视频| 欧美大胆成人| 尤物在线精品视频|