以前一直想寫點東西,可一直沒有開始實施,各類緣由都有,最大緣由可能仍是本身太懶了,嘿嘿。最近在看Spring in action這本書,爲了能讓本身堅持下去把書看完,此次決定同步的在博客園上寫個Spring系列欄目,期中部分代碼案例是本身發揮寫的,和書上不同,你們參考理解,有錢的小夥伴也能夠買一本本身看看。另外,因爲我不是什麼專業的編輯,也不多寫文章,全部文章中有個別病句或者錯別字的你們別介意,我本身也儘可能避免。前端
在接觸java開發以前,我是一個 .net Developer,作了4年多的 .net後公司技術方向開始全面轉向java,又得從菜鳥階段開始學習java web方面的知識,剛開始接觸Spring的時候並不知道它具體到底能作什麼,學習java web開發的大部分應該都知道model1=>model2=>MVC這樣的演變過程,可這裏主要注重的仍是前端界面和後臺服務代碼的交互方式升級,若是拋除掉這部分,咱們在實現複雜業務邏輯的時候,確定會用到不少的業務類,第三方組件等,還有涉及到數據庫的訪問,咱們後臺服務的代碼結構該怎麼處理呢?java
之前作 .net的時候第一個階段,全部代碼都寫在一塊兒,界面處理,業務邏輯,數據訪問都在一個類裏面,而後就是開始三層架構,把業務層、數據訪問層、對象模型層分開,代碼結構更清晰,更容易維護,再下一個階段隨着系統愈來愈複雜,爲了更好的可維護性,開始在各層之間增長接口,使用面向接口的編程,慢慢的把代碼的耦合性下降。全部道理都是互通的,Spring已個人個人理解,它的使命就是儘可能的簡化Java開發工做,爲了下降Java開發的複雜性,讓咱們的代碼結構更簡潔明瞭,更易維護,增長代碼的重複利用。總結下來,爲了下降Java開發的複雜性,Spring採起了如下4中策略web
Spring竭力的避免因自身API而弄亂項目的代碼,她不會強迫你實現Spring規範的接口或者繼承Spring的類,咱們本身編寫的java類在Spring以外也能夠無缺的運行,因此Spring提供的一種非引入性或者最小引入性的編程。spring
首先簡單說明下什麼是依賴注入,依照慣例,第一個例子怎麼能少的了Hello World呢,嘿嘿,請看代碼,首先咱們定義一個HelloWorld的類:數據庫
public class HelloWorld { /* * syaHello方法,和世界說你好。 */ public void sayHello(){ System.out.println("Hello World!"); } }
如今咱們已經用java代碼實現了咱們的第一個類,調用sayHello()方法就能夠向這個世界說一聲Hello了,可咱們本身說話的聲音過小,聽到的人太少,怎麼辦呢?咱們須要藉助一些工具來讓更多的人聽到,下面咱們定義一個工具類編程
public class RadioTool { public void say(String message){ System.out.println(message); } }
咱們來修改下以前的HelloWorld類:架構
public class HelloWorld { /* * 定義說話工具 */ private RadioTool radio; public RadioTool getSayTool() { return radio; } public void setSayTool(RadioTool radio) { this.radio = radio; } /* * syaHello方法,和世界說你好。 */ public void sayHello(){ //使用工具 radio.say("Hello World!"); } }
下面咱們來測試下程序ide
import com.seven.springTest.service.impl.HelloWorld; import com.seven.springTest.service.impl.RadioTool; public class Test { public static void main(String[] args) { // TODO Auto-generated method stub //定義HelloWorld對象 HelloWorld hw= new HelloWorld(); //定義SayTool工具對象 RadioTool radio = new RadioTool(); //把工具對象賦給HelloWorld對象hw hw.setSayTool(radio); //調用hw的sayHello()說出「Hello World」 hw.sayHello(); } }
好了,咱們的案例代碼寫完了,咱們的HelloWorld類依靠RadioTool類向更多的人說出「Hello World」,HellWorld類對RadioTool類就是一種依賴關係,若是沒有RadioTool類,它就沒辦法讓更多的人聽到。傳統的方式,咱們經過代碼來手動的給對象注入依賴,咱們構造一個RadioTool的實例並經過setSayTool()方法賦給HelloWorld實例,這個過程就是一種依賴注入,只不過這個注入是由咱們本身經過代碼來完成的。耦合性很是強,若是咱們代碼在編寫的時候不知道要給HelloWorld提供RadioTool類對象,那麼程序就會報錯,另外若是有一天咱們須要更換新的工具,咱們就必須從新編寫代碼。代碼維護性就比較差。爲了更好的解除HelloWorld和RadioTool之間的耦合性,咱們引入面向接口的編程,首先咱們定義通用的工具類接口:工具
package com.seven.springTest.service; public interface SayTool { public void say(String message); }
而後咱們修改以前的RadioTool類,讓它繼承SayTool接口學習
package com.seven.springTest.service.impl; import com.seven.springTest.service.SayTool; public class RadioTool implements SayTool { public void say(String message){ System.out.println(message); } }
咱們來修改HelloWorld類
import com.seven.springTest.service.SayTool; public class HelloWorld { /* * 定義說話工具 */ private SayTool tool; public HelloWorld(SayTool tool){ this.tool=tool; } /* * syaHello方法,和世界說你好。 */ public void sayHello(){ //使用工具 tool.say("Hello World!"); } }
這裏咱們以前依賴的RadioTool更換成了SayTool接口對象,HelloWorld類與SayTool接口之間耦合,而不是與具體的SayTool接口實現類來耦合,咱們能夠很方便的替換實現方式。同門在再定義一個電視工具
import com.seven.springTest.service.SayTool; public class TVTool implements SayTool { @Override public void say(String message) { System.out.println(message); } }
咱們分別定義了RadioTool和TVTool兩種SayTool接口的具體實現類,HelloWorld類中依賴的是SayTool接口,全部能夠很方便的更換具體的實現,而不用在從新編寫代碼。一般狀況下咱們定義接口變量,並經過實例化具體的實現類來給接口對象賦予具體的實現,==這種建立應用組件以前的協做的行爲一般稱爲裝配==,針對給接口提供哪個具體的實現,也就是裝配哪種具體的實現bean,在Spring中提供了多種方式,主要包括3種: