Spring IoC學習總結

Spring IoC學習總結


學習spring Ioc整理的一些筆記,很簡單。分享給你們。html

IoC 基本概念java

在這以前,咱們先記住一句話。好萊塢原則:Don't call us, we will call you.
其實這句話很恰當地形容了「反轉」的意味;
Ioc, Inversion of Control,控制反轉,它還有一個別名叫「依賴注入」(DI Dependency Injection)。IoC不是什麼技術,而是一種設計思想。在Java開發中,Ioc意味着將你設計好的對象交給容器控制,而不是傳統的在你的對象內部直接控制。如何理解好Ioc呢?理解好Ioc的關鍵是要明確「誰控制誰,控制什麼,爲什麼是反轉(有反轉就應該有正轉了),哪些方面反轉了」spring

  • 誰控制誰,控制什麼:傳統Java SE程序設計,咱們直接在對象內部經過new進行建立對象,是程序主動去建立依賴對象;而IoC是有專門一個容器來建立這些對象,即由Ioc容器來控制對 象的建立;誰控制誰?固然是IoC 容器控制了對象;控制什麼?那就是主要控制了外部資源獲取(不僅是對象包括好比文件等)。
  • 爲什麼是反轉,哪些方面反轉了:有反轉就有正轉,傳統應用程序是由咱們本身在對象中主動控制去直接獲取依賴對象,也就是正轉;而反轉則是由容器來幫忙建立及注入依賴對象;爲什麼是反轉?由於由容器幫咱們查找及注入依賴對象,對象只是被動的接受依賴對象,因此是反轉;哪些方面反轉了?依賴對象的獲取被反轉了。

還有一個概念:DI 依賴注入。大部分認爲IoC和DI只是不一樣的叫法而已。
理解DI的關鍵是:「誰依賴誰,爲何須要依賴,誰注入誰,注入了什麼數組

  • 誰依賴於誰:固然是應用程序依賴於IoC容器;
  • 爲何須要依賴:應用程序須要IoC容器來提供對象須要的外部資源;
  • 誰注入誰:很明顯是IoC容器注入應用程序某個對象,應用程序依賴的對象;
  • 注入了什麼:就是注入某個對象所須要的外部資源(包括對象、資源、常量數據)。

Spring IoC緩存

我理解的spring IoC分爲兩部分:Bean實例的建立依賴注入學習

Spring IoC容器如何實例化Bean呢?傳統應用程序能夠經過new和反射方式進行實例化Bean。而Spring IoC容器則須要根據Bean定義裏的配置元數據使用反射機制來建立Bean。(你們能夠了解一下Java的反射機制,這是Spring Ioc實現Bean實例化的核心機制)在Spring IoC容器中根據Bean定義建立Bean主要有如下幾種方式:ui

  • 使用構造器實例化Bean 有參/無參
  • 使用靜態工廠實例化Bean
  • 使用實例工廠實例化Bean
<!--使用默認構造參數-->  
<bean name="bean1" class="com.java.spring.Demo"/>  
    <!--使用有參數構造參數-->  
   
<bean name="bean2" class="com.java.spring.Demo">  
<!-- 指定構造器參數 -->  
    <constructor-arg index="0" value="Hello Spring!"/>  
</bean> 

<!-- 使用靜態工廠方法 -->  
<bean id="bean3" class="com.java.spring.DemoStaticFactory" factory-method="newInstance">  
     <constructor-arg index="0" value="Hello Spring!"/>  
</bean>

<!--一、定義實例工廠Bean -->  
<bean id="DemoInstanceFactoryv"  
class="com.java.spring.DemoInstanceFactory"/>  
<!—二、使用實例工廠Bean建立Bean -->  
<bean id="bean4"  
factory-bean="DemoInstanceFactory"  
     factory-method="newInstance">  
 <constructor-arg index="0" value="Hello Spring!"></constructor-arg>  
</bean>

另外,靜態工廠和實例工廠方法還有對應的靜態工廠類和實例工廠類.net

/**
*   靜態工廠類
*
**/
public class DemoStaticFactory {  
    //工廠方法  
       public static HelloApi newInstance(String message) {  
              //返回須要的Bean實例  
           return new Demo(message);  
}  
}  

/**
*   實例工廠類
*
**/
package com.java.spring;  
public class DemoInstanceFactory {  
public HelloApi newInstance(String message) {  
          return new Demo(message);  
   }  
}

這一塊補充一個細節。Spring何時實例化bean,首先要分2種狀況:prototype

  • 第一:若是你使用BeanFactory做爲Spring Bean的工廠類,則全部的bean都是在第一次使用該Bean的時候實例化
  • 第二:若是你使用ApplicationContext做爲Spring Bean的工廠類,則又分爲如下幾種狀況:設計

    (1):若是bean的scope是singleton的,而且lazy-init爲false(默認是false,因此能夠不用設置),則ApplicationContext啓動的時候就實例化該Bean,而且將實例化的Bean放在一個map結構的緩存中,下次再使用該Bean的時候,直接從這個緩存中取 
       (2):若是bean的scope是singleton的,而且lazy-init爲true,則該Bean的實例化是在第一次使用該Bean的時候進行實例化 
       (3):若是bean的scope是prototype的,則該Bean的實例化是在第一次使用該Bean的時候進行實例化

    一般使用ApplicationContext做爲容器的。

使用@Autowire註解注入的時機則是容器剛啓動的時候就開始注入;注入以前要先初始化bean;
ApplicationContext 的初始化和BeanFactory 有一個重大的區別:BeanFactory在初始化容器時,並未實例化Bean,直到第一次訪問某個Bean 時才實例目標Bean;而ApplicationContext 則在初始化應用上下文時就實例化全部單實例的Bean。


瞭解Bean的實例化後,接下來就是Bean實例之間的關係,也就是依賴注入;
Spring IoC容器的依賴有兩層含義:Bean依賴容器容器注入Bean的依賴資源

  • Bean依賴容器:也就是說Bean要依賴於容器,這裏的依賴是指容器負責建立Bean並管理Bean的生命週期,正是因爲由容器來控制建立Bean並注入依賴,也就是控制權被反轉了,這也正是IoC名字的由來,此處的有依賴是指Bean和容器之間的依賴關係。
  • 容器注入Bean的依賴資源:容器負責注入Bean的依賴資源,依賴資源能夠是Bean、外部文件、常量數據等,在Java中都反映爲對象,而且由容器負責組裝Bean之間的依賴關係,此處的依賴是指Bean之間的依賴關係,能夠認爲是傳統類與類之間的「關聯」、「聚合」、「組合」關係。

Spring IoC容器注入依賴資源主要有如下兩種基本實現方式:

  • 構造器注入:就是容器實例化Bean時注入那些依賴,經過在在Bean定義中指定構造器參數進行注入依賴,包括實例工廠方法參數注入依賴,但靜態工廠方法參數不容許注入依賴;
  • setter注入:經過setter方法進行注入依賴;

1、構造器注入:
1)常量值

<constructor-arg index="0" value="常量"/> <!--簡寫 -->
<constructor-arg index="0"><value>常量</value></constructor-arg><!--全寫 -->

2)引用

<constructor-arg index="0" ref="引用"/><!--簡寫 -->
<constructor-arg index="0"><ref bean="引用"/></constructor-arg><!--全寫 -->

2、setter注入:
1)常量值

<property name="message" value="常量"/><!--簡寫 -->
<property name="message"><value>常量</value></ property><!--全寫 -->

2)引用

<property name="message" ref="引用"/><!--簡寫 -->
<property name="message"><ref bean="引用"/></ property><!--全寫 -->

3)數組:<array>

<property name="values">  
    <array>  
        <value>1</value>  
        <value>2</value>  
        <value>3</value>  
    </array>  
</property>

4)列表:<list>

<property name="values">  
    <list>  
        <value>1</value>  
        <value>2</value>  
        <value>3</value>  
    </list>  
</property>

5)集合:<set>

<property name="values">  
    <set>  
        <value>1</value>  
        <value>2</value>  
        <value>3</value>  
    </set>  
</property>

6)字典

<!--簡寫 -->
<map>
    <entry key="鍵常量" value="值常量"/>
    <entry key-ref="鍵引用" value-ref="值引用"/>
</map>
<!--全寫 -->
<map>
    <entry><key><value>鍵常量</value></key><value>值常量</value></entry>
    <entry><key><ref bean="鍵引用"/></key><ref bean="值引用"/></entry>
</map>

7)Properties

另外,基於註解驅動的Spring Ioc的原理以及Spring IoC源碼剖析相關我在在網上找到一些文章,你們也能夠看一下。
Spring依賴注入的兩種方式xml和註解
使用註釋驅動的Ioc功能
Spring IoC源碼剖析

相關文章
相關標籤/搜索