SSM 初探(一)Spring核心知識點

人類的發展很大原因是因爲人的惰性
        SSM框架是由Spring,Spring MVC, Mybatis組成,其實就是一棟房子由三種不同顏色的磚搭建起來的意思。每一種磚塊都負責這房子的不同部分。比如打地基要用一種材料,建房子主體需要另一種磚塊,房頂就需要瓦去裝飾了。
        在研究了一段時間的框架之後,發現其中的很多設計靈感都是來源於生活的,就像剛開始說的“人類的發展很大原因是因爲人的惰性”,顯然,框架都是源於計算機工程師們在開發時候想要進行簡化,偷懶而誕生的。
        很多人遇到新的技術就會有種恐懼,認爲新技術涉及到自己的盲區,需要自己再次花大量的時間去學習,但是我每次遇到新的技術就會有一種衝動,越新的技術具有前沿的設計理念,也就意味着更容易讓人理解,工程師的工作通過新技術可以更加輕鬆,這樣就有更多的時間與家人朋友共處了。
        關於SSM框架的設計目的就是爲了將數據,業務,表示的代碼分離開來,這樣我想改哪一塊內容都不用牽扯到其他模塊的修改,這就是所謂的解除代碼之間的耦合(關聯性)。
        Spring模塊的核心就是“依賴注入”(dependency injection, DI)與“面向切面編程”(aspect-oriented programming, AOP),再帶一個小的概念“控制反轉”(Inversion of control, IoC)。
        很多人剛接觸到這個概念一頭霧水,作爲框架新手的我也是和大家一樣對於這些新興的概念感到陌生與不理解。但是我們要記住一點就是任何框架的核心目的就是爲了簡化開發,減少工程師的工作量,框架變化多端但其中的核心思想是不會變化的。以這樣的思維方式去看待新的技術就會有別樣的感覺。
        首先是“依賴注入”,從字面上來看就是把所謂的“依賴”灌輸到一個類似於容器的東西,如果你剛看到這個詞就這麼想的話,那麼恭喜你,你已經理解了Spring的一部分設計理念了。那麼什麼是“依賴”呢?“依賴”顧名思義就是雙方存在一定的關係唄,這樣彼此間才能相互依賴。那麼在Java代碼裏,依賴體現在兩個類之間存在互相使用的情況,比如代碼1中,在類A裏面有個方法new了一個類B,那就可以說類A對類B有一個依賴,因爲如果我使用A裏面的這個方法,就會創建一個B,這樣這兩個類不就緊緊綁在一起了麼,這兩個類緊緊綁在一起也就反映了所謂的“耦合”。

//代碼1
class A {
    void createB(){
        B b = new B();
        b.speak();
    }
}

class B {
    void speak(){
        System.out.print("hello");
    }
}

       有一天你想修改類B的一些屬性,比如構造器裏面傳一些參數之類的,那你不僅僅要改類B,你是不是還要去類A裏面看看有沒有要修改的地方。這樣太難受了,萬一文件一多,光找類A都要好久呢。所以工程師就想能不能在我想要修改B的時候不需要去尋找其他使用到B的地方呢,這樣我就能節省大量的時間專注在對B這個本尊的修改上了,而不用再去管其他地方。這時候“依賴注入”的概念就登場了。
        爲什麼不把整個B作爲形參放到A這個方法的參數裏面呢?仔細分析一下下圖的代碼,看看與上圖的初始設計有什麼不一樣的地方。

//代碼2
class A {
    void createB(B b){
        b.speak();
    }
}

class B {
    void speak(){
        System.out.print("hello");
    }
}

        代碼2中的代碼是將B作爲參數傳遞到A的方法裏,避免了使用new關鍵字新建B的操作。爲了體現計算機軟件設計的高大上,工程師們就把這種對象作爲參數傳遞到相應的類裏行爲稱爲“依賴注入”。“依賴”就是互相關聯的對象,“注入”就是把對象作爲參數放到相應的方法裏面,這樣的話如果工程師想要修改類B的參數方法,不管怎麼修改都與類A無關了。這樣很輕鬆就達到了降低“耦合”的效果,A雖然用到了B,但是B的修改與A的任何操作都無關,“鬆耦合”意味着開發的簡化,工程師們就能提前下班了。
        對於“面向切面編程”,這個詞看上去也是符合計算機科學的“高大上”特性,就是看不懂。其實問題的重點在於理解什麼是“切面”。切面,顧名思義就是把一塊東西切開了之後的那個橫截面。試想長條麪包,如果就吃麪包,乾巴巴的不好吃,那麼你就會尋思如何向麪包里加入一些佐料,很簡單的方法就是將麪包切開,像做三明治那樣加入火腿片,或者芝士片,這樣麪包的味道就很棒了。如果你理解了這個,那麼你就已經理解了“面向切面編程”的核心了。試想一個軟件系統,把它比作一個長條麪包,今天我想吃火腿麪包,那我只要切開面包,把火腿片加到切面處就可以了,明天我又想吃芝士夾心的麪包,那隻要切開面包加入芝士片就可以了。火腿片,芝士片就可以抽象成系統中重複的功能代碼,把它們封裝起來成爲固定的火腿片,芝士片,想吃的時候只要取出放到切面裏就可以了,這樣簡化了做不同口味麪包的過程,而且你如果想吃多塊火腿片也是十分容易的,在需要加入火腿片的地方切上一刀放入火腿片即可。“面向切面編程”就是把一些可以重複使用的功能抽取出來做成火腿芝士片(高大上一點的說法就是把遍佈軟件各處的功能分離出來形成可以重用的組件),在軟件的某些位置需要使用的時候直接插入進去就可以了,這樣就能使得軟件架構更加清晰,從而降低了系統的複雜性,對於工程師來說,越簡單的系統越好,正如格言“Make things stupid”闡明的那樣。
        最後一個概念是“控制反轉”,這個是最容易理解的概念。我們可以把這個詞拆分成“控制”與“反轉”。如果你寫過Java代碼,對於對象的創建肯定是非常熟悉的,就是採用new關鍵字,比如寫爛大街的Person p = new Person();這行代碼就是新建了一個名字爲p的Person對象。那麼設想一下,每次你要使用這個對象的時候是不是都需要採用new關鍵字進行創建之後,才能使用對象內部的功能。工程師的惰性又來了,我要是能夠想用對象的時候直接用該多好,我不想對着滿屏幕的new關鍵字發呆了,每次new完還要考慮什麼時候銷燬這個對象,這種編碼令人頭大。如何解決這個問題呢?
        爲什麼不設計一個機器人,把所有要用的對象交給它,每次我要用哪一個對象的時候,和這個機器人說一聲,這個機器人就能很準確的拿出這個對象交到我手上,就像一個倉庫管理員一樣,我們只負責提貨,而不用每次都想辦法如何搞到想要使用的對象了。這就是“控制反轉”,將對創建對象的“控制權”從我們工程師手上“反”交給機器幫助我們去創建,我只需要機器幫我創建完對象然後交給我使用就可以了。這是一種設計思想,所謂的“反其道而行之”,體現了軟件設計領域的一大高招。
        綜上所述,Spring沒有什麼難的地方,要始終記住,框架等新技術的誕生都是爲了簡化開發的,而不是爲工程師增加負擔的,其核心思想是不會改變的,越新的技術反而越簡單,堅信這一點就可以了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章