spring框架學習之路(一)-入門基礎(1)-IOC(控制反轉)&DI(依賴注入)

前言

  我就是一小白程序猴,不懂什麼高新技術,只是在學習過程中把自己遇到問題或者學到的新知識記錄下來,第一給自己複習用,第二小白更懂小白的苦,自己是新手所以應該更瞭解在剛開始學習時哪些學起來有困難,也就避開了所謂的專家盲點,給後面入坑的人一點點啓示也是有用的吧.......應該...如果有同樣正在學spring的同學,可以一起交流一哈(想寫就寫一點,邊學一邊更)

  如果這些文字有幸被某位大牛看到,歡迎指正不足,真的歡迎!!!

 

  spring的工作環境搭建,,,網上都是教程,自己找吧!

  開始spring,必須瞭解以下三個概念,我儘量寫的白話點兒,哈哈。

  IOC:控制反轉

  DI:依賴注入

  AOP:面向方面編程

 

  今兒就先寫一寫我對IOC和DI 的理解吧:

  IOC(控制反轉):不是什麼技術,而是一種設計思想。他是spring的內核和基礎,要理解這個東西,你得知道啥叫“工廠設計模式”和“反射”,不瞭解的話先自學吧,,(坑以後填T_T)。

  所謂“控制反轉”,將控制權從程序自身轉移到第三方(在spring中就是指applicationContext.xml文檔)。

  通俗講,就是程序知道自己要創建一個屬於某種類型的類(即實現了某個接口),但不瞭解要創建的這個類是該接口的哪一個具體實現類。在程序具體執行時,才向第三方請示要創建的是哪一個實體類(具體表現就是程序解析applicationContext.xml文件)。至於程序具體是怎麼創建的實體類,其實就是用了java中反射(這個坑之後有時間填.....)。

  這樣用戶不需要修改程序內容,只需要配置xml文件,就可以實現對程序的控制。

具體可以看下面的例子:

//接口  代表一個墨盒
public interface Ink {
	void outInk();//噴墨
}
//實現類1,黑白墨盒
public class BlackInk implements Ink{
	@Override
	public void outInk() {
		System.out.println("黑白墨盒!");
	}	
}
//實現類1,彩色墨盒
public class ColorInk implements Ink {
	@Override
	public void outInk() {
		System.out.println("彩色墨盒!");
	}
}



  首先配置xml文件內容:

<bean id="ink" class="code.bean.BlackInk"></bean>

  然後就可以在main方法中調用了:

	public static void main(String[] args) {
		ClassPathResource resource=new ClassPathResource("applicationContext.xml");	
		XmlBeanFactory factory=new XmlBeanFactory(resource);		
		Ink ink=factory.getBean("ink",Ink.class);		
		ink.outInk();		
	}


  輸出結果:


  黑白墨盒!


  然後,在我們不修改任何java代碼的情況,只修改xml文件

<bean id="ink" class="code.bean.ColorInk"></bean>

  再次運行main方法,結果爲:


  彩色墨盒!


  這就是 IOC(Inversion of Control):控制反轉 的設計思想。

 ---------------------------------------我是分割線ε≡٩(๑>₃<)۶ 一心向學------------------------------------

  然後,接着上面的內容介紹DI

  DI(Dependency Injection):依賴注入,其實是IOC的另一種解釋。事實上,是發現IOC這個概念不能對我們所提到spring的設計思想進行準確的描述,所以提出了DI的概念。

  也有人認爲IOC是個更寬泛的概念,DI是更具體的

  在我們之前傳統的程序設計中,我們是通過類與類之間的調用來實現某項功能。但是用DI的設計思想,就是我們可以先創建被調用類的對象,然後把它注入到需要它的類中。

  這樣的設計可以讓我們方便的把不同的被調用類注入同一個調用類,而不用更改代碼。

  說白話一點,就是我們利用DI可以在上面IOC內容的基礎上創建擁有字段(屬性)的類,並且對這些屬性進行初始化。

  接着我們上面的代碼繼續舉栗子昂~~

  在我們有了Ink接口、BlackInk以及Corlor類之後,我們再建一個Printer類:

public class Printer {
	private Ink ink;	
	
	public void out(){
		ink.outInk();
	}
	
	public Printer() {	}
	public Printer(Ink ink) {
		this.ink = ink;
	}
	public void setInk(Ink ink) {
		this.ink = ink;
	}
}


在以前,我們要調用Printer類的out方法,是這個樣子的:

Printer print=new Printer(new BlackInk());
print.out();

如果我們要更改墨盒,就要再次更改程序代碼;

而利用DI設計思想,

我們在applicationContext.xml文件中配置:

<bean id="black" class="code.bean.ColorInk"></bean>
<bean id="color" class="code.bean.ColorInk"></bean>
<bean id="printer" class="code.bean.Printer">
<property name="ink" ref="black"></property>
</bean>

main方法只需要這麼寫:

	public static void main(String[] args) {
		ClassPathResource resource=new ClassPathResource("applicationContext.xml");	
		XmlBeanFactory factory=new XmlBeanFactory(resource);		
		
		Printer printer=factory.getBean("printer",Printer.class);
		printer.out();		
	}

這樣的執行結果就是:


彩色墨盒!


而如果我們需要更改墨盒時,只需要更改xml:

<property name="ink" ref="color"></property>

不需要再次更改java代碼。

核心就是怎麼注入這些依賴關係。可以分爲兩類(以Printer爲慄):

A)利用set方法,就是我們上面的這種做法。

<property name="ink" ref="black"></property>

B)利用帶參構造方法

<bean id="printer" class="code.bean.Printer">
<constructor-arg>
<ref local="black"/>
</constructor-arg>
</bean>

 另外還可以利用<bean>的autowire屬性,autowire="byType",但是不建議使用,因爲如果在上下文中如果有多個符合的bean時會報錯。

 

另外還要特別注意的是 <bean>scope屬性,默認值是singleton即單例模式,只會創建一個對象。

          <-IOC/DI完結->



發佈了26 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章