欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring.Net IOC依賴(lài)注入原理流程解析

 更新時(shí)間:2020年07月17日 10:08:32   作者:一生安然  
這篇文章主要介紹了Spring.Net IOC依賴(lài)注入原理流程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

一。什么是IOC.(Inversion of Control)

  IOC,即控制反轉(zhuǎn)。不是什么技術(shù),而是一種思想。在傳統(tǒng)開(kāi)發(fā)中,我們需要某個(gè)對(duì)象時(shí),就手動(dòng)去new一個(gè)依賴(lài)的對(duì)象。而IOC意味著將對(duì)象的控制權(quán)交給容器,而不在是直接在對(duì)象的內(nèi)部控制。如何理解IOC呢?理解好IOC的關(guān)鍵是要明確‘誰(shuí)控制了誰(shuí),控制了什么?為何是反轉(zhuǎn)?(有反轉(zhuǎn)既有正轉(zhuǎn)),哪些反面反轉(zhuǎn)了。'

誰(shuí)控制了誰(shuí)?控制了什么?:傳統(tǒng)程序設(shè)計(jì),我們直接在對(duì)象內(nèi)部通過(guò)new來(lái)創(chuàng)建對(duì)象,是程序主動(dòng)去創(chuàng)建對(duì)象。而在ioc中,是通過(guò)一個(gè)容器去創(chuàng)建這些對(duì)象,即IOC容器控制對(duì)象的創(chuàng)建;誰(shuí)控制了誰(shuí)?當(dāng)然是IOC容器創(chuàng)建了對(duì)象;控制了什么?當(dāng)然是控制了外部資源的獲取。(不只是對(duì)象,比如包括文件等)

為何是反轉(zhuǎn)?哪些方面反轉(zhuǎn)了?:有反轉(zhuǎn)就有正轉(zhuǎn)。傳統(tǒng)應(yīng)用程序由我們自己在對(duì)象中主動(dòng)獲取創(chuàng)建依賴(lài)對(duì)象,也就是正轉(zhuǎn);而反轉(zhuǎn)則是由容器來(lái)創(chuàng)建及注入依賴(lài)對(duì)象。為什么是反轉(zhuǎn)呢?因?yàn)橛扇萜鲙臀覀儾檎壹白⑷胍蕾?lài),對(duì)象只是被動(dòng)的接受依賴(lài)對(duì)象,所以是反轉(zhuǎn)。哪些方面反轉(zhuǎn)了?依賴(lài)對(duì)象的獲取被反轉(zhuǎn)了。

圖列說(shuō)明

圖一. 傳統(tǒng)程序設(shè)計(jì),主動(dòng)創(chuàng)建相關(guān)對(duì)象,再組合起來(lái)

圖二。當(dāng)有了IOC/DI容器之后,客戶(hù)端不在主動(dòng)創(chuàng)建這些對(duì)象

二。iOC能夠做什么?

  IOC是一種思想,而不是新的技術(shù)。一個(gè)重要的面向?qū)ο缶幊痰姆▌t,它能指導(dǎo)我們?nèi)绾卧O(shè)計(jì)出松耦合,更優(yōu)良的程序。傳統(tǒng)的應(yīng)用程序都是我們?cè)陬?lèi)的內(nèi)部,主動(dòng)的創(chuàng)建應(yīng)用對(duì)象,從而導(dǎo)致類(lèi)與類(lèi)之間,高耦合,難于測(cè)試。有了IOC容器,就將查找和創(chuàng)建依賴(lài)對(duì)象的控制交給了容器,由容器進(jìn)行注入組合對(duì)象,所以對(duì)象與對(duì)象之間,是松散耦合的,使得程序的整個(gè)體系結(jié)構(gòu)變得非常靈活。

  其實(shí)IOC對(duì)編程帶來(lái)最大的變化,不是從代碼上的,而是思想上,發(fā)生了‘主從換位'的變化。應(yīng)用程序原本是老大,需要什么資源,都是主動(dòng)去獲取。但是在IOC/DI中,應(yīng)用程序變成了被動(dòng)了,被動(dòng)的等待容器來(lái)創(chuàng)建并注入它所需要的資源。

  IOC很好的體現(xiàn)了面向?qū)ο笤O(shè)計(jì)原則,好萊塢法則:“別找我們,我們找你”。即由IOC容器幫對(duì)象去找依賴(lài)的對(duì)象,并注入,而不是由對(duì)象主動(dòng)去找。

三。IOC和DI

  DI(Dependency Injection),即依賴(lài)注入。是組件之間的關(guān)系由容器在在運(yùn)行期確定,形象的說(shuō),即由容器動(dòng)態(tài)的將某個(gè)依賴(lài)關(guān)系注入到組件之中。依賴(lài)注入的目的并非為軟件系統(tǒng)帶來(lái)更多功能,而是為了提升組件重用的頻率,并為系統(tǒng)搭建一個(gè)靈活、可擴(kuò)展的平臺(tái)。通過(guò)依賴(lài)注入機(jī)制,我們只需要通過(guò)簡(jiǎn)單的配置,而無(wú)需任何代碼就可指定目標(biāo)需要的資源,完成自身的業(yè)務(wù)邏輯,而不需要關(guān)心具體的資源來(lái)自何處,由誰(shuí)實(shí)現(xiàn)。

理解DI的關(guān)鍵是:‘誰(shuí)依賴(lài)了誰(shuí),為什么需要依賴(lài),誰(shuí)注入了誰(shuí),注入了什么':

誰(shuí)依賴(lài)了誰(shuí):當(dāng)然是應(yīng)用程序依賴(lài)了容器為什么需要依賴(lài):應(yīng)用程序需要IOC容器提供對(duì)象所需要的資源誰(shuí)注入了誰(shuí):很明顯是IOC容器注入應(yīng)用程序某個(gè)對(duì)象,應(yīng)用程序依賴(lài)的對(duì)象注入了什么:就是注入某個(gè)對(duì)象所需要的外部資源(包括對(duì)象,資源,文件,常量數(shù)據(jù))  

  IOC和DI之間,是同一個(gè)概念不同角度的描述。相對(duì)于IOC而言,“依賴(lài)注入“明確描述” 被注入對(duì)象依賴(lài)IOC容器配置依賴(lài)對(duì)象”。

四 。Spring.Net之IOC的配置

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="spring">
      <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
      <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
    </sectionGroup>
  </configSections>
  <spring>
    <context>
      <!--加載容器所需的配置文件,默認(rèn)是config文件.這里單獨(dú)定義一個(gè)文件xml,來(lái)配置容器.需要注意的是,xml文件屬性需要設(shè)置為始終復(fù)制或如果較新規(guī)則復(fù)制-->
      <resource uri="config://spring/objects"/>
      <resource uri="F:\\C#\\SpingNetIOCV2\\ioc\\ioc.xml"/>
    </context>
    <objects xmlns="http://www.springframework.net">
      <!--<object name="myIoc" type="SpingNetIOCV2.model.Moveis,SpingNetIOCV2"></object>-->
    </objects>
  </spring

ioc.xml代碼段配置如下:

<?xml version="1.0" encoding="utf-8" ?>
<objects>
  <object name="myIoc" type="SpingNetIOCV2.model.Moveis,SpingNetIOCV2"></object>
</objects>

控制臺(tái)程序main方法中,引用Spring.Context命令空間,以便IApplicationContext接口訪問(wèn)IOC容器。,下面通過(guò)容器,獲取一個(gè)創(chuàng)建的對(duì)象:

public static void Main(string[] args)
    {
      //獲取容器對(duì)象
      IApplicationContext context = ContextRegistry.GetContext();
      //通過(guò)容器創(chuàng)建對(duì)象
      Moveis m =(Moveis)context.GetObject("myIoc");
      Console.WriteLine(m.GetType().Name);//結(jié)果輸出Moveis
      Console.ReadKey();
    }

A。通過(guò)屬性注入依賴(lài)對(duì)象 

<?xml version="1.0" encoding="utf-8" ?>
<objects>
  <!--MovieLister對(duì)象,依賴(lài)SimpleMovieTXTFinder獲取對(duì)應(yīng)的電影資源-->
  <object name="myIoc" type="SpingNetIOCV2.model.MovieLister,SpingNetIOCV2">
    <property name="move" ref="SimpleMovieTXTFinder"></property>
  </object>
  <!--SimpleMovieTXTFinder類(lèi)是加載獲取存儲(chǔ)在txt文本中的電影信息工具類(lèi)-->
  <object name="SimpleMovieTXTFinder" type="SpingNetIOCV2.model.SimpleMovieTXTFinder,SpingNetIOCV2"></object>
</objects>
public static void Main(string[] args)
    {
      //獲取容器對(duì)象
      IApplicationContext context = ContextRegistry.GetContext();
      //通過(guò)容器創(chuàng)建對(duì)象
      //Moveis m =(Moveis)context.GetObject("myIoc");
      //通過(guò)屬性注入(set值方法注入)。對(duì)象MovieLister依賴(lài)IMoveis,通過(guò)容器創(chuàng)建依賴(lài)對(duì)象,注入到對(duì)象MovieLister的move屬性中
      //容器先創(chuàng)建MovieLister對(duì)象,看MovieLister類(lèi)是否需要注入。如果需要注入,則創(chuàng)建所需的依賴(lài)對(duì)象SimpleMovieTXTFinder,然后通過(guò)屬性。注入到MovieLister對(duì)象中
      MovieLister ml = (MovieLister)context.GetObject("myIoc");
      Console.WriteLine(ml.GetType().Name);//結(jié)果輸出MovieLister
      ml.GetMoves(1);
      Console.ReadKey();
    }

B。構(gòu)造器注入依賴(lài)

<?xml version="1.0" encoding="utf-8" ?>
<objects>
  <!--MovieLister對(duì)象,依賴(lài)SimpleMovieTXTFinder獲取對(duì)應(yīng)的電影資源-->
  <object name="myIoc" type="SpingNetIOCV2.model.MovieLister,SpingNetIOCV2">
    <property name="move" ref="SimpleMovieTXTFinder"></property>
  </object>
  <!--SimpleMovieTXTFinder類(lèi)是加載獲取存儲(chǔ)在txt文本中的電影信息工具類(lèi)-->
  <object name="SimpleMovieTXTFinder" type="SpingNetIOCV2.model.SimpleMovieTXTFinder,SpingNetIOCV2">
    <!--<constructor-arg/>節(jié)點(diǎn)就是用來(lái)為構(gòu)造器提供參數(shù)的IoC容器使用某個(gè)內(nèi)置的類(lèi)型轉(zhuǎn)換器將字符串“move.txt”轉(zhuǎn)換為System.IO.FileInfo-->
    <constructor-arg index="0" value="../../move.txt"/>
  </object>
</objects>

文本move.text是電影文本列表,IOC容器通過(guò)構(gòu)造器注入,將外部資源注入到了MovieLister對(duì)象中。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Springboot中動(dòng)態(tài)語(yǔ)言groovy介紹

    Springboot中動(dòng)態(tài)語(yǔ)言groovy介紹

    Apache的Groovy是Java平臺(tái)上設(shè)計(jì)的面向?qū)ο缶幊陶Z(yǔ)言,這門(mén)動(dòng)態(tài)語(yǔ)言擁有類(lèi)似Python、Ruby和Smalltalk中的一些特性,可以作為Java平臺(tái)的腳本語(yǔ)言使用,這篇文章主要介紹了springboot中如何使用groovy,需要的朋友可以參考下
    2022-09-09
  • Java中的LinkedHashMap源碼分析

    Java中的LinkedHashMap源碼分析

    這篇文章主要介紹了Java中的LinkedHashMap源碼分析,LinkedHashMap是HashMap的子類(lèi),所以基本的操作與hashmap類(lèi)似,不過(guò)呢,在插入、刪除、替換key-value對(duì)的時(shí)候,需要的朋友可以參考下
    2023-12-12
  • MyBatis-plus的五種批量插入方式對(duì)比分析

    MyBatis-plus的五種批量插入方式對(duì)比分析

    本文主要介紹了MyBatis-plus的五種批量插入方式對(duì)比分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Mybatisplus創(chuàng)建Spring?Boot工程打包錯(cuò)誤的解決方式

    Mybatisplus創(chuàng)建Spring?Boot工程打包錯(cuò)誤的解決方式

    最近在實(shí)戰(zhàn)springboot遇到了一些坑,記錄一下,下面這篇文章主要給大家介紹了關(guān)于Mybatisplus創(chuàng)建Spring?Boot工程打包錯(cuò)誤的解決方式,文中通過(guò)圖文介紹的介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • Java this、final等關(guān)鍵字總結(jié)

    Java this、final等關(guān)鍵字總結(jié)

    這篇文章主要對(duì)java中this、final等關(guān)鍵字進(jìn)行了總結(jié),需要的朋友可以參考下
    2017-04-04
  • Java枚舉學(xué)習(xí)之定義和基本特性詳解

    Java枚舉學(xué)習(xí)之定義和基本特性詳解

    枚舉是JAVA?5.0后增加的一個(gè)重要類(lèi)型??梢杂脕?lái)表示一組取值范圍固定的變量。本文將通過(guò)示例為大家詳細(xì)講解枚舉的定義和基本特性,感興趣的可以了解一下
    2022-08-08
  • Spring Cloud Feign的文件上傳實(shí)現(xiàn)的示例代碼

    Spring Cloud Feign的文件上傳實(shí)現(xiàn)的示例代碼

    這篇文章主要介紹了Spring Cloud Feign的文件上傳實(shí)現(xiàn)的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • Java中的Semaphore信號(hào)量使用方法代碼實(shí)例

    Java中的Semaphore信號(hào)量使用方法代碼實(shí)例

    這篇文章主要介紹了Java中的Semaphore信號(hào)量使用方法代碼實(shí)例,Semaphore是一種基于計(jì)數(shù)的信號(hào)量,它可以設(shè)定一個(gè)閾值,基于此,多個(gè)線程競(jìng)爭(zhēng)獲取許可信號(hào),做自己的申請(qǐng)后歸還,超過(guò)閾值后,線程申請(qǐng)?jiān)S可信號(hào)將會(huì)被阻塞,需要的朋友可以參考下
    2023-11-11
  • Java反射機(jī)制詳解

    Java反射機(jī)制詳解

    Java的反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任何一個(gè)類(lèi),都可以知道這個(gè)類(lèi)的所有屬性和方法,對(duì)于任何一個(gè)對(duì)象,都可以調(diào)用它所有的方法和屬性,修改部分類(lèi)型信息。本文就來(lái)詳細(xì)講講Java反射機(jī)制的使用
    2022-07-07
  • 使用@Autowired可以注入ApplicationContext

    使用@Autowired可以注入ApplicationContext

    這篇文章主要介紹了使用@Autowired可以注入ApplicationContext問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06

最新評(píng)論