激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

香港云服务器
服務(wù)器之家 - 編程語言 - Java教程 - Java Spring 控制反轉(zhuǎn)(IOC)容器詳解

Java Spring 控制反轉(zhuǎn)(IOC)容器詳解

2022-01-25 13:52JD強(qiáng)子 Java教程

這篇文章主要為大家詳細(xì)介紹了Spring控制反轉(zhuǎn)IoC入門使用的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

IoC 容器是 Spring 的核心,也可以稱為 Spring 容器。Spring 通過 IoC 容器來管理對象的實(shí)例化和初始化,以及對象從創(chuàng)建到銷毀的整個(gè)生命周期。

Spring 中使用的對象都由 IoC 容器管理,不需要我們手動(dòng)使用 new 運(yùn)算符創(chuàng)建對象。由 IoC 容器管理的對象稱為 Spring Bean,Spring Bean 就是 Java 對象,和使用 new 運(yùn)算符創(chuàng)建的對象沒有區(qū)別。

Spring 通過讀取 XML 或 Java 注解中的信息來獲取哪些對象需要實(shí)例化。

Spring 提供 2 種不同類型的 IoC 容器,即 BeanFactory 和 ApplicationContext 容器。

 

什么是容器?

容器是一種為某種特定組件的運(yùn)行提供必要支持的一個(gè)軟件環(huán)境。例如,Tomcat就是一個(gè)Servlet容器,它可以為Servlet的運(yùn)行提供運(yùn)行環(huán)境。類似Docker這樣的軟件也是一個(gè)容器,它提供了必要的Linux環(huán)境以便運(yùn)行一個(gè)特定的Linux進(jìn)程。

通常來說,使用容器運(yùn)行組件,除了提供一個(gè)組件運(yùn)行環(huán)境之外,容器還提供了許多底層服務(wù)。例如,Servlet容器底層實(shí)現(xiàn)了TCP連接,解析HTTP協(xié)議等非常復(fù)雜的服務(wù),如果沒有容器來提供這些服務(wù),我們就無法編寫像Servlet這樣代碼簡單,功能強(qiáng)大的組件。早期的JavaEE服務(wù)器提供的EJB容器最重要的功能就是通過聲明式事務(wù)服務(wù),使得EJB組件的開發(fā)人員不必自己編寫冗長的事務(wù)處理代碼,所以極大地簡化了事務(wù)處理。

無侵入容器

在設(shè)計(jì)上,Spring的IoC容器是一個(gè)高度可擴(kuò)展的無侵入容器。所謂無侵入,是指應(yīng)用程序的組件無需實(shí)現(xiàn)Spring的特定接口,或者說,組件根本不知道自己在Spring的容器中運(yùn)行。這種無侵入的設(shè)計(jì)有以下好處:

1.應(yīng)用程序組件既可以在Spring的IoC容器中運(yùn)行,也可以自己編寫代碼自行組裝配置;

2.測試的時(shí)候并不依賴Spring容器,可單獨(dú)進(jìn)行測試,大大提高了開發(fā)效率。

 

IOC控制反轉(zhuǎn)

Spring提供的容器又稱為IoC容器,什么是IoC?

Ioc―Inversion of Control,即“控制反轉(zhuǎn)”,不是什么技術(shù),是一個(gè)概念,是一種思想。指將傳統(tǒng)上由程序代 碼直接操控的對象調(diào)用權(quán)交給容器,通過容器來實(shí)現(xiàn)對象的裝配和管理。控制反轉(zhuǎn)就是對對象控制權(quán)的轉(zhuǎn)移,從程序代碼本身反轉(zhuǎn)到了外部容器。通過容器實(shí)現(xiàn)對象的裝配和管理。通俗點(diǎn)講,將對象的創(chuàng)建權(quán)交給spring,我們需要new對象,則由spring幫我們創(chuàng)建,然后供我們使用。

那么必然的我們需要?jiǎng)?chuàng)建一個(gè)容器,同時(shí)需要一種描述來讓容器知道需要?jiǎng)?chuàng)建的對象與對象的關(guān)系。這個(gè)描述最具體表現(xiàn)就是我們可配置的文件。IoC的實(shí)質(zhì)是如何管理對象,傳統(tǒng)意義上我們使用new方式來創(chuàng)建對象,但在企業(yè)應(yīng)用開發(fā)的過程中,大量的對象創(chuàng)建都在程序中維護(hù)很容易造成資源浪費(fèi),并且不利于程序的擴(kuò)展。

其實(shí)現(xiàn)方式多種多樣。當(dāng)前比較流行的實(shí)現(xiàn)方式是依賴 注入。應(yīng)用廣泛。

依賴:classA 類中含有 classB 的實(shí)例,在 classA 中調(diào)用 classB 的方法完成功能,即 classA 對 classB 有依賴。

IOC理論推導(dǎo)

傳統(tǒng)應(yīng)用程序開發(fā)的弊端

在理解IoC之前,我們先看看通常的Java組件是如何協(xié)作的。

我們先用我們原來的方式寫一段代碼 .

1、先寫一個(gè)UserDao接口

Java Spring 控制反轉(zhuǎn)(IOC)容器詳解

2、再去寫Dao的實(shí)現(xiàn)類

public class UserDaoOneImpl implements UserDao {
 @Override
 public void getUser() {
     System.out.println("One獲取用戶數(shù)據(jù)");
}
}

3、然后去寫UserService的接口

Java Spring 控制反轉(zhuǎn)(IOC)容器詳解

4、最后寫Service的實(shí)現(xiàn)類

Java Spring 控制反轉(zhuǎn)(IOC)容器詳解

5、測試一下

Java Spring 控制反轉(zhuǎn)(IOC)容器詳解

6、再回到UserDao接口

Java Spring 控制反轉(zhuǎn)(IOC)容器詳解

把Userdao的實(shí)現(xiàn)類增加一個(gè) .

public class UserDaoMyTwoImpl implements UserDao {
 @Override
 public void getUser() {
     System.out.println("Two獲取用戶數(shù)據(jù)");
}
}

7、我們就需要去service實(shí)現(xiàn)類里面修改對應(yīng)的實(shí)現(xiàn)

public class UserServiceImpl implements UserService {
 private UserDao userDao = new UserDaoTwo();
 @Override
 public void getUser() {
     userDao.getUser();
}
}

在假設(shè), 我們再增加一個(gè)Userdao的實(shí)現(xiàn)類 .

public class UserDaoThreeImpl implements UserDao {
 @Override
 public void getUser() {
     System.out.println("Three獲取用戶數(shù)據(jù)");
}
}

那么我們要使用Three , 又需要去service實(shí)現(xiàn)類里面修改對應(yīng)的實(shí)現(xiàn) . 假設(shè)我們的這種需求非常大 , 這種方式就根本不適用了, 甚至反人類對吧 , 每次變動(dòng) , 都需要修改大量代碼 . 這種設(shè)計(jì)的耦合性太高了, 牽一發(fā)而動(dòng)全身 .

“注入”機(jī)制

注入應(yīng)用程序某個(gè)對象,應(yīng)用程序依賴的對象

依賴注入可以通過set()方法實(shí)現(xiàn)。但依賴注入也可以通過構(gòu)造方法實(shí)現(xiàn)。Spring的IoC容器同時(shí)支持屬性注入和構(gòu)造方法注入,并允許混合使用。

我們可以在需要用到他的地方 , 不去實(shí)現(xiàn)它 , 而是留出一個(gè)接口 , 利用set , 我們?nèi)ゴa里修改下 .

Java Spring 控制反轉(zhuǎn)(IOC)容器詳解

@Test
public void test(){
 UserServiceImpl service = new UserServiceImpl();
 service.setUserDao( new UserDaoTwoImpl() );
 service.getUser();
 //那我們現(xiàn)在又想添加Three去實(shí)現(xiàn)呢
 service.setUserDao( new UserDaoThreeImpl() );
 service.getUser();
}

以前所有東西都是由程序去進(jìn)行控制創(chuàng)建 , 而現(xiàn)在是由我們自行控制創(chuàng)建對象 , 把主動(dòng)權(quán)交給了調(diào)用者 . 程序不用去管怎么創(chuàng)建,怎么實(shí)現(xiàn)了 . 它只負(fù)責(zé)提供一個(gè)接口 .

這種思想 , 從本質(zhì)上解決了問題 , 我們程序員不再去管理對象的創(chuàng)建了 , 更多的去關(guān)注業(yè)務(wù)的實(shí)現(xiàn) . 耦合性大大降低 . 這也就是IOC的原型 !

小結(jié)

傳統(tǒng)程序設(shè)計(jì)如圖,都是主動(dòng)去創(chuàng)建相關(guān)對象然后再組合起來:

Java Spring 控制反轉(zhuǎn)(IOC)容器詳解

沒有什么是加一層解決不了的

Java Spring 控制反轉(zhuǎn)(IOC)容器詳解

當(dāng)有了IoC/DI的容器后,在客戶端類中不再主動(dòng)去創(chuàng)建這些對象了

 

IOC本質(zhì)

IoC是Spring框架的核心內(nèi)容,使用多種方式完美的實(shí)現(xiàn)了IoC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置實(shí)現(xiàn)IoC。

Spring容器在初始化時(shí)先讀取配置文件,根據(jù)配置文件或元數(shù)據(jù)創(chuàng)建與組織對象存入容器中,程序使用時(shí)再從Ioc容器中取出需要的對象。

Java Spring 控制反轉(zhuǎn)(IOC)容器詳解

控制反轉(zhuǎn)是一種通過描述(XML或注解)并通過第三方去生產(chǎn)或獲取特定對象的方式。在Spring中實(shí)現(xiàn)控制反轉(zhuǎn)的是IoC容器,其實(shí)現(xiàn)方法是依賴注入(Dependency Injection,DI)。

DI(依賴注入)

IoC的一個(gè)重點(diǎn)是在系統(tǒng)運(yùn)行中,動(dòng)態(tài)的向某個(gè)對象提供它所需要的其他對象。這一點(diǎn)是通過DI(Dependency Injection,依賴注入)來實(shí)現(xiàn)的。 比如對象A需要操作數(shù)據(jù)庫,以前我們總是要在A中自己編寫代碼來獲得一個(gè)Connection對象,有了 spring我們就只需要告訴spring,A中需要一個(gè)Connection,至于這個(gè)Connection怎么構(gòu)造,何時(shí)構(gòu)造,A不需要知道。在系統(tǒng)運(yùn)行時(shí),spring會(huì)在適當(dāng)?shù)臅r(shí)候制造一個(gè)Connection,然后像打針一樣,注射到A當(dāng)中,這樣就完成了對各個(gè)對象之間關(guān)系的控制。A需要依賴 Connection才能正常運(yùn)行,而這個(gè)Connection是由spring注入到A中的,依賴注入的名字就這么來的。那么DI是如何實(shí)現(xiàn)的呢? Java 1.3之后一個(gè)重要特征是反射(reflection),它允許程序在運(yùn)行的時(shí)候動(dòng)態(tài)的生成對象、執(zhí)行對象的方法、改變對象的屬性,spring就是通過反射來實(shí)現(xiàn)注入的。

 

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注服務(wù)器之家的更多內(nèi)容!

原文鏈接:https://blog.csdn.net/m0_53698336/article/details/120574690

延伸 · 閱讀

精彩推薦
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經(jīng)有好久沒有升過級了。升級完畢重啟之后,突然發(fā)現(xiàn)好多錯(cuò)誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程20個(gè)非常實(shí)用的Java程序代碼片段

    20個(gè)非常實(shí)用的Java程序代碼片段

    這篇文章主要為大家分享了20個(gè)非常實(shí)用的Java程序片段,對java開發(fā)項(xiàng)目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧...

    富貴穩(wěn)中求8032021-07-12
  • Java教程xml與Java對象的轉(zhuǎn)換詳解

    xml與Java對象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java實(shí)現(xiàn)搶紅包功能

    Java實(shí)現(xiàn)搶紅包功能

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)搶紅包功能,采用多線程模擬多人同時(shí)搶紅包,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java8中Stream使用的一個(gè)注意事項(xiàng)

    Java8中Stream使用的一個(gè)注意事項(xiàng)

    最近在工作中發(fā)現(xiàn)了對于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個(gè)非常重要的注意點(diǎn),所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7482021-02-04
933
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 国产成人高清在线 | av影院在线播放 | 亚洲欧美日韩精品久久亚洲区色播 | 亚洲一区成人在线 | 国产一区二区三区视频观看 | 国产一级二级在线播放 | 91av在线免费 | 亚洲第一综合色 | 最新毛片在线观看 | 国产一级毛片高清视频完整版 | 爱操视频 | 国产黄色一区二区 | 国产欧美日韩视频在线观看 | 国产在线精品一区二区三区 | 黄色免费在线电影 | 久久99精品久久 | 在线天堂资源 | 1314成人网| 精品国产91久久久久久浪潮蜜月 | 欧美亚洲国产成人综合在线 | 久久久一区二区 | 做羞羞视频 | 免费观看视频网站 | 亚洲成人免费视频在线 | 日韩精品中文字幕一区二区三区 | 国产成人综合在线视频 | 福利在线小视频 | 日本一区免费看 | av电影在线网站 | 免费一级在线 | 黄色片小说 | 一区二区三区欧洲 | 久草在线小说 | 国产女厕一区二区三区在线视 | 视频一区二区精品 | 欧美性生交大片 | 国产精品一区二区手机在线观看 | 狠狠干五月天 | 久久亚洲国产精品 | 成人午夜毛片 | 中文字幕在线播放不卡 |