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

首頁 > 編程 > JSP > 正文

詳解Spring的核心機制

2024-09-05 00:18:52
字體:
來源:轉載
供稿:網友

Spring可以說是設計層面的框架,它可以解決業務邏輯層的問題,下面是錯新技術頻道小編為大家介紹的詳解Spring的核心機制,讓我們一起學習吧!

詳解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" 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) {    // 創建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" class="com.Chinese">    <!-- 使用構造注入,為chinese實例注入stoneAxe實例 -->    <constructor-arg ref="stoneAxe" />  </bean>    <!-- 配置stoneAxe實例 -->  <bean id="stoneAxe" class="com.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方法,所有的依賴關系全部在構造器內設定。因此,無須擔心后續的代碼對依賴關系產生破壞

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

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

通過上述的介紹,大家都了解了詳解Spring的核心機制了吧,想學習更多的專業資訊,請繼續關注錯新技術頻道吧!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美亚洲在线播放| 久久久久久噜噜噜久久久精品| 国产精品9999| 欧美一级视频免费在线观看| 日韩av大片在线| 欧美一区二区大胆人体摄影专业网站| 中文字幕不卡在线视频极品| 91国内免费在线视频| 久久香蕉国产线看观看网| 日韩成人中文电影| 97热在线精品视频在线观看| 精品久久久免费| 欧美高清一级大片| 精品动漫一区二区| 国产精品99一区| 久久成人国产精品| 国产在线98福利播放视频| 久久久久久国产精品| 亚洲男人天堂古典| 精品视频偷偷看在线观看| 欧美一级免费视频| 亚洲欧美中文日韩v在线观看| 欧美在线观看一区二区三区| 国产精品久久久久久网站| 欧美另类69精品久久久久9999| 欧美日本高清一区| 国产91免费看片| 色婷婷久久一区二区| 91在线观看免费高清完整版在线观看| 国产一区二区三区视频在线观看| 国产精品久久99久久| 欧美精品18videos性欧美| 亚洲激情视频在线播放| 亚洲欧美资源在线| 亚洲综合精品伊人久久| 久久免费视频网| 777国产偷窥盗摄精品视频| 欧美刺激性大交免费视频| 欧美一区三区三区高中清蜜桃| 久久久www成人免费精品张筱雨| 亚洲日韩中文字幕在线播放| 欧美在线欧美在线| 91亚洲国产成人精品性色| 欧美高清视频一区二区| 精品国产美女在线| 日韩综合视频在线观看| 色综合视频一区中文字幕| 久久久久久久色| 国产精品一区电影| 日本国产精品视频| 久久精品中文字幕电影| 久久精品91久久久久久再现| 精品久久久久久久久久久久| 欧美丝袜第一区| 国产精品专区h在线观看| 亚洲国产成人久久综合| 欧美猛交ⅹxxx乱大交视频| 成人一区二区电影| 成人一区二区电影| 国产一区二区三区精品久久久| 性欧美xxxx交| 国产亚洲欧美日韩精品| 国产一区二区三区四区福利| 久久久久国产精品免费| 日韩电影大全免费观看2023年上| 亚洲国产小视频| 日韩电影在线观看中文字幕| 疯狂做受xxxx欧美肥白少妇| 久久久久久亚洲精品中文字幕| 欧美日韩在线观看视频小说| 国产成人精品综合久久久| 欧美日韩日本国产| 久久久精品视频在线观看| 久久久久久久香蕉网| 久久久久久香蕉网| 成人做爰www免费看视频网站| 日韩有码在线视频| 综合国产在线观看| 欧美午夜女人视频在线| 久久精品人人做人人爽| 欧美理论电影在线观看| 欧美日韩国产麻豆| 亚洲在线免费视频| 最近免费中文字幕视频2019| 亚洲xxx视频| 欧美视频二区36p| 性日韩欧美在线视频| 国产有码在线一区二区视频| 欧美在线免费看| 国产精品久久久久久亚洲调教| 成人中文字幕+乱码+中文字幕| 国产99在线|中文| 668精品在线视频| 91美女福利视频高清| 91中文在线视频| 国产aⅴ夜夜欢一区二区三区| 国产精品精品久久久久久| 日韩欧美一区二区在线| 日韩激情第一页| 91sao在线观看国产| 日韩精品在线视频美女| 97精品国产97久久久久久免费| 91在线观看欧美日韩| 久久夜色精品国产亚洲aⅴ| 亚洲国产天堂久久国产91| 久久久国产成人精品| 亚洲春色另类小说| 在线观看国产精品淫| 欧美日韩国产中文字幕| 欧美日韩中文在线观看| 日韩免费在线电影| 伊人伊成久久人综合网小说| 国产精品扒开腿做爽爽爽男男| 日韩av电影免费观看高清| 最近2019中文字幕大全第二页| 国产精品成人免费视频| 欧美乱大交xxxxx| 韩国精品久久久999| 激情久久av一区av二区av三区| 国产精品一区二区久久| 欧美专区福利在线| 亚洲一区二区三区视频播放| 国产精品欧美日韩| 孩xxxx性bbbb欧美| 久久亚洲国产成人| 久久精品久久久久电影| 91在线免费视频| 欧美成人免费va影院高清| 国产在线视频不卡| 欧美日本啪啪无遮挡网站| 欧美亚洲成人精品| 精品国产一区二区三区久久狼5月| 最新中文字幕亚洲| 精品视频—区二区三区免费| 久久精品电影网站| 超碰97人人做人人爱少妇| 91久久国产婷婷一区二区| 日韩中文字幕在线视频播放| 国产成人精彩在线视频九色| 久久久国产精品免费| 在线视频免费一区二区| www.欧美三级电影.com| 亚洲黄页网在线观看| 久久久中精品2020中文| 亚洲国产精品久久| 欧美一区第一页| 久久九九免费视频| 亚洲影视中文字幕| 欧美成人精品在线| 欧美另类极品videosbest最新版本| 亚洲人成电影网站色…| 国产一区二区三区毛片| 亚洲精品免费av| 欧美国产在线电影| 一本色道久久88精品综合| 91久久夜色精品国产网站| 亚洲国产成人久久| 亚洲a在线观看| 国产亚洲欧美一区| 亚洲欧美成人一区二区在线电影| 国产视频综合在线| 97超级碰在线看视频免费在线看| 色悠久久久久综合先锋影音下载| 欧美激情第一页xxx|