前言:
我就是一小白程序猴,不懂什麼高新技術,只是在學習過程中把自己遇到問題或者學到的新知識記錄下來,第一給自己複習用,第二小白更懂小白的苦,自己是新手所以應該更瞭解在剛開始學習時哪些學起來有困難,也就避開了所謂的專家盲點,給後面入坑的人一點點啓示也是有用的吧.......應該...如果有同樣正在學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完結->