1. 程式人生 > >Spring學習(七)深入理解Spring IoC容器

Spring學習(七)深入理解Spring IoC容器

IoC他是Spring容器的核心,AOP、宣告式事務等功能都依賴於此功能,它涉及程式碼解耦,設計模式、程式碼優化等問題的考量。 接下來使用電影與演員的關係來詳細解釋一下IoC: 我們來使用電影《無間道》中劉德華所飾演的角色劉建明在天台對白來作為我們學習IoC的示例場景。 那麼我們現在便有: 介面類:ActorArrangable、LiuJianming Java Bean:WuJianDao 介面實現類:LiuDeHua實現LiuJianming介面 執行類:Director 在傳統的表演模式中,是劇本與演員直接耦合。即劇本直接指定LiuDeHua來表演


那麼在引入角色介面LiuJianming之後,類與類之間的關係變為:


在這種情況下,WuJianDao還是和角色LiuJianming、演員LiuDeHua之間存在耦合關係。

那麼我們該如何實現讓演員與劇本無關,即劇本只與角色有關,但卻必須使LiuDeHua來完成角色的表演。 那麼,我們便引入導演類Director 這時,由導演選擇劇本,併為劇本定義一個角色LiuJianming,讓LiuJianming這個角色插入到劇本當中去。 最後讓LiuDeHua來飾演LiuJianming這個角色。
對應到軟體當中,導演就像是一個裝配器。他來安排演員表演具體的角色。 那麼我們現在便可以來談談IoC的概念, IoC從字面意思上可以理解為:
  • 其一 控制
  • 其二 反轉
那到底是什麼東西的控制被反轉了呢?
對應到前面的例子 控制指的是選擇LiuJianming角色扮演著的控制權 反轉是指這種控制權從WuJianDao劇本中移除,轉交到了導演的手中。 那麼對於軟體來說:就是對應某個介面的控制權從呼叫類當中來移除,轉交到了第三方來決定。 由此也引出了DI的概念:讓呼叫類對某一介面實現類的依賴關係由第三方注入,以移除呼叫類對某一介面實現類的依賴 接下來看一下IoC的注入型別 IoC從注入方法上看,主要劃分為三種類型: 1.建構函式注入:通過呼叫類的建構函式,將介面實現類通過建構函式變數傳入
Public class WuJianDao {
  private LiuJianming ljm;
  //1:注入劉建明的具體扮演者
  public WuJianDao(LiuJianming ljm) {
     this.ljm = ljm;
  }
    public void tianTai() {
             ljm.declare(“我想做一個好人!”)
    }
}

Public class Director {
  public void direct() {
     //2.指定角色的扮演者
     LiuJianming ljm = new LiuDeHua();
     //3.注入具體扮演者到劇本中
     WuJianDao wjd = new WuJianDao(ljm);
     wjd.tianTai();
   }
}

2.屬性注入:通過Setter方法完成呼叫類所需依賴的注入,更加靈活方便
Public class WuJianDao {
  private LiuJianming ljm;
  //1.屬性注入方法
  public void setLjm(LiuJianmin ljm) {
     this.ljm = ljm;
  }
  public void tianTai() {
     ljm.declare(“我想做一個好人!”)
    }
}

Public class Director {
  public void direct() {
     LiuJianming ljm = new LiuDeHua();
     WuJianDao wjd = new WuJianDao();
     //2.呼叫屬性Setter方法注入
     wjd.setLjm(ljm);
     wjd.tianTai();
}

3.介面注入:將呼叫類所有依賴注入的方法抽取到一個介面中,呼叫類通過實現該介面提供相應的注入方法。
Public interface ActorArrangable {
  void injectLjm(LiuJianming ljm);
}

Public class WuJianDao
implements ActorArrangable {
  private LiuJianming ljm;
  //1.實現介面方法
  public void injectLjm(LiuJianming ljm)
    {this.ljm = ljm; }
  public void tianTai() {
     ljm.declare(“我想做一個好人!”)
    }
}

Public class Director {
  public void direct() {
     LiuJianming ljm = new LiuDeHua();
     WuJianDao wjd= new WuJianDao();
     wjd.injectLjm(ljm);
     wjd.tianTai();
   }
}

由於採用介面注入需要額外宣告一個介面,這無疑就增加了類的數目。 而且他的效果和屬性注入並沒有本質上的區別。所以,我們在Spring IoC當中並不提倡採用這種方式。 Spring作為一個容器,通過配置檔案或者註解描述類和類之間的依賴關係,自動完成類的初始化和依賴注入的工作, 下面是對以上例項進行配置的配置檔案:
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:p="http://www.springframework.org/schema/p"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
  <bean id="ljm" class="cn.lovepi.chapter02.ioc.LiuDeHua"/>
  <bean id="wjd" class="cn.lovepi.chapter02.ioc.WuJianDao"
        p:geli-ref="ljm"/>
</beans>

那麼,Spring為什麼會有這種神奇般的力量呢? 僅憑一個簡單的配置檔案,就能魔法般的實現例項化並裝配好程式所用的Bean呢。這種神奇的力量歸功與JAVA語言本身的類反射功能。 下面,我們就來了解下JAVA語言的反射機制。

相關推薦

Spring學習深入理解Spring IoC容器

IoC:他是Spring容器的核心,AOP、宣告式事務等功能都依賴於此功能,它涉及程式碼解耦,設計模式、程式碼優化等問題的考量。 接下來使用電影與演員的關係來詳細解釋一下IoC: 我們來使用電影《無

spring深入學習深入理解 Spring IOC

1、IOC理論 IOC英文縮寫:Inversion of control, 另一個縮寫為DI:依賴注入(Denpency Injection) 用作控制反轉 理解:spring IOC就是負責物件生命週期和物件之間的關係 以找女朋友為例子: 一般情況下我們是如何來找女

spring學習spring整合JDBC

Spring中封裝了一個可操作資料庫的物件,該物件封裝了JDBC技術 使用資料庫   一、導包(IDEA的maven工程,在pom.xml檔案中匯入依賴,必須注意依賴,不然會報各種異常) <?xml version="1.0" encoding="UTF-8"?> &l

Spring 學習——Bean 的作用域

•在 Spring 中, 可以在 <bean> 元素的 scope 屬性裡設定 Bean 的作用域. •預設情況下, Spring 只為每個在 IOC 容器裡宣告的 Bean 建立唯一一個例項, 整個 IOC 容器範圍內都能共享該例項:所有後續的 getBean() 呼叫和 Bea

Spring學習-泛型注入

@Autowired註解自動 裝配具有相容型別的單個bean屬性 1.bean-generic-di.xml <?xml version="1.0" encoding="UTF-8"?&g

Spring 學習 宣告式事務管理

先來回顧一下事務 事務這個概念一開始是在資料庫中被提起的 事務的特性: ACID 原子性:指事務是一個不可分割的工作單位,事務的操作要麼都發生,要麼都不發生 一致性:指事務前後資料的完整性必須保證一致 隔離性:指多個使用者併發訪問資料庫時,一個使用者

shiro的源碼學習-- 深入理解realm

instance his face 成功 返回 void exce gen 調用 IniRealm的類結構如下圖: 下面分析每個類: (1)Ream: 域的頂點,其代碼如下:securityManager會使驗證器來調用,驗證器通過Realm返回用戶信息,確定用戶是否登錄

彙編學習6深入理解little-

菜雞初學彙編,總結下 little-endian。這個破東西也困擾我好久,也算終於搞明白了。 little-endian 簡單來說即低位位元組排放在記憶體的低地址端,高位位元組排放在記憶體的高地址端。 首先,明確一點,最小的單元都是位元組;資料在記憶體中的存放是以位元組為單位的。位元

spring深入學習IOC 之解析 bean 標籤:BeanDefinition

解析 bean 標籤的過程其實就是構造一個 BeanDefinition 物件的過程,<bean> 元素標籤擁有的配置屬性,BeanDefinition 均提供了相應的屬性,與之一一對應。所以我們有必要對 BeanDefinition 有一個整體的認識。 BeanDefin

Java程式設計師從笨鳥到菜鳥之八十二細談Spring十一深入理解spring+struts2整合附原始碼

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Spring Boot IoC學習條件裝配Bean

七、條件裝配Bean 有時候某些客觀因素會使得一些Bean無法進行初始化,例如資料庫連線池的配置中漏掉一些配置會造成資料來源不能連線上。這樣的情況下,IoC容器如果還進行資料來源的裝配,則系統將會丟擲異

spring學習helloworld編寫總結

cati 流程 spring學習 一個 1-1 png cat 其中 XML 配置Bean: 配置bean的方式:1.基於xml文件的方式 2.基於註解的方式。 Bean的配置方式;1.通過全類名(反射)2.通過工廠方法 IOC容器:ApplicationContext和

spring學習配置bean的一些相關知識

相關 idt 工作內容 分享 配置文件 ext 處理器 lac 數據 1.bean的作用域問題 bean的scope屬性可以用來限定bean的作用域,有四個取值singleton((默認) prototype(常用) request session分別表示不同的範圍

Spring實戰Bean 的作用域

targe app value aop get java ppi component size   1、Spring中bean 的多種作用域 單例(Singleton):整個應用中只創建一個bean 的實例,Spring默認創建單例的bean; 原型(Prototype)

spring-學習

相關 細節 mvc 客戶端和服務器 web應用 利用 例如 常見 註入 概述 Spring 是最受歡迎的企業級 Java 應用程序開發框架。主要用來在java EE平臺上開發web應用。 好處 spring可以使開發人員使用pojos開發企業級的應用程序。 spring是有

Spring學習3Spring概述轉載

效率 調度 jpa 源代碼 一個 維護 html www hiberna 1. Spring是什麽?   Spring是一個開源的輕量級Java SE(Java 標準版本)/Java EE(Java 企業版本)開發應用框架,其目的是用於簡化企業級應用程序開發。   在面向對

Spring學習3IOC基礎轉載

目標 發生 由於 不同 擴展 通過 new 包括 control 一. IoC是什麽   Ioc—Inversion of Control,即“控制反轉”,不是什麽技術,而是一種設計思想。在Java開發中,Ioc意味著將你設計好的對象交給容器控制,而不是傳統的在你的對象內部

Spring學習4IOC容器配置bean:定義與實例化

dimp 工廠類 def 流程 行為 更多 多個 scrip 編譯報錯 一. IOC容器配置   1. 一些概念   (1)IOC容器:   定義:具有管理對象和管理對象之間的依賴關系的容器。   作用:應用程序無需自己創建對象,對象由IOC容器創建並組裝。BeanFac

Spring Boot擴展分析

初始化 arr throws 使用 關閉 監聽器 getenv and 註冊 前面的章節在分析SpringBoot啟動過程中,我們發現SpringBoot使用Spring框架提供的SpringFactoriesLoader這個類,實現檢索META-INF/sp

Spring Boot MyBatis代碼自動生成和輔助插件

erb resources dbcc pri artifact target 業務 ssd 只需要 一、簡介 1.1 MyBatis Generator介紹 MyBatis Generator 是MyBatis 官方出品的一款,用來自動生成MyBatis的 mapper、d