學習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
還有一個概念:DI 依賴注入。大部分認爲IoC和DI只是不一樣的叫法而已。
理解DI的關鍵是:「誰依賴誰,爲何須要依賴,誰注入誰,注入了什麼」數組
Spring IoC緩存
我理解的spring IoC分爲兩部分:Bean實例的建立和依賴注入;學習
Spring IoC容器如何實例化Bean呢?傳統應用程序能夠經過new和反射方式進行實例化Bean。而Spring IoC容器則須要根據Bean定義裏的配置元數據使用反射機制來建立Bean。(你們能夠了解一下Java的反射機制,這是Spring Ioc實現Bean實例化的核心機制)在Spring IoC容器中根據Bean定義建立Bean主要有如下幾種方式:ui
<!--使用默認構造參數--> <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
第二:若是你使用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的依賴資源:
Spring IoC容器注入依賴資源主要有如下兩種基本實現方式:
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源碼剖析