1. Spring概念心得
2. Spring核心基礎
3. Spring簡單範例解說
1. Spring的概念與心得
我自認一開始在學習Spring的路上非常堅辛,因為學習時所接觸的教材大部份的講解都較深入及專業,或是在用詞及說明方式上比較不能容易的能讓人無基礎的人理解。在整整1個月的不斷學習,最後再透過老師的指導解惑,我才終於對Spring有基本的瞭解。以下就以自我學習的心得,用白話的方式做分享,或許觀念上不盡與他人相同,但希望能用不同的角度去理解Spring。
Spring主要的概念與目的簡單來說,就是…..
方便改Code
減少改Code
不用改Code
— — — — — 讓維護程式更加的有效率
每個人寫code的風格都不同,10個人對同一程式就有10種不同寫法。所以當遇到要修改別人的code時,就會變的有一定的難度在,即使是資深的程式人員Programmer(PG),也需要花上一些時間。
程式的世界中有三個維護時常見的現象。1. 沒有不用改的code。2. 一開始的PG和後面維護的PG不一定是同一個。3. 自己寫的code,可能過段時間就不認識它了。因此Spring能有效的改善維護時的效率,在當發生如果真的要改code時,就要能方便的改,且還要減少改的範圍,最好是能不用改,我認為這就是Spring要傳達的主要概念與目的。
2. Spring的核心基礎
Spring的二大的基本核心基礎,是DI與IoC。
DI=依賴注入(Dependency Injection)
IoC=控制反轉 (Inversion of Control)
DI=依賴注入(Dependency Injection)
DI依賴注入,有人說是一種想法、是一種風格、是一種理念,甚至是一種原則,說白了就是「程式的寫法」。什麼是程式的寫法?下面舉個例子。
從上面的二段程式來看,都是可以執行同樣的結果,但哪種「程式的寫法」或是「設計風格」比較好呢?答案是2,因為未來在維護時,可以針對str再做不同的判斷、調用及改值。但上述並不是DI依賴注入,而是DI依賴注入也是一樣的「程式寫法」或「設計風格」的概念,為的是未來在維護時能更加的靈活。想仔細瞭解什麼是DI依賴注入,可以再參考其他的教學文。
IoC=控制反轉 (Inversion of Control)
IoC控制反轉,簡單來說就是把「產生物件這件事交給IoC去做」。白話的來說,IoC只是一個xml檔,也可以是一個class(Bean class)。IoC裡面最基本的來說,就只是設定其他class(Bean class)的名稱,以及建構子所會用到的參數或物件(Object)。
在Java裡,產生物件(new一個class)最基本的,就是要看這個物件在產生(建構)時,是否要先帶入什麼參數,這就是建構子(Constructor)。所以產生物件這事件就交給IoC去做,這樣程式會變成如何呢?從下面二個例子來看看…
IoC範例1
IoC範例2
從範例1中,如果要使用Family這個物件,就要在自己的class中去new出來,並且放入建構子的參數。而在範例2中,多了中間這個IoC.xml,在xml中設定了所有的class以及所需要帶入的參數,而原本的class就不需要有new這個動作。
看到這裡,或許會有人會和我剛開始學習Spring的時候有相同的疑問,為了IoC控制反轉而多寫了一個xml,且不過就只是把class在new時的動作另外抽出來寫,這樣不是增加code嗎?哪裡有符合最上面說的方便改code、減少改code?
假設一個情境,如果這個Family的建構子,從原本的4個參數增加到10個或減少只剩下1個?且這個Family class物件被很多個class new 出來使用呢?那你要改多少個有使用到Family的class?答案是,「全部都要改」。但如果是使用IoC控制反轉的方法,就需修改一次就好。
透過上圖來看,可以知道IoC控制反轉在中間的關連性。更能明白原來一個IoC控制反轉就幫助程式人員Programmer(PG)處理掉這麼多的關連,讓開發人員的專注範圍能更集中。IoC控制反轉這樣的好處,也是一種分工的概念,讓每個人的負責好自己的程式,使用不同人寫的class時,只需要匯入使用,剩下的就交給IoC處理吧。
3. Spring簡單範例解說
題目:晚餐的食物,從原本吃豬肉改成吃雞肉。
第一段,建一個晚餐Dinner的class,裡面要有一個method叫吃晚餐eatDinner。然後Dinner裡面要有一個Food物件叫豬肉Pork,Pork裡會有一個method叫getFood,然後印出“晚餐吃豬肉”。
第二段,把豬肉Pork改成雞肉Chicken,Chicken裡一樣會有一個method叫getFood,然後印出“晚餐吃雞肉”。
在還是Java初學者且沒有學過Spring的我會是以下的寫法
上面一開始使用的是Pork,當要改成Chicken時,Dinner整體都要跟著變動。而在學習Spring後,為了考量以後維護的靈活與方便,會改成下面的寫法。
上面透過Spring的DI依賴注入(Dependency Injection)及IoC控制反轉 (Inversion of Control)的概念,建立一個Interface讓豬肉Pork與雞肉Chicken去實作,並且透過xml將所需的物件注入到對象裡,這樣Dinner class裡的food要從豬肉Pork換成雞肉Chicken,只需要修改中間的IoC.xml就可以了。
這樣的好處是,右邊的Food未來可以增加牛肉Beef、羊肉Lamb、魚肉Fish…..等,但Dinner class完全不需要更改。相反的左邊在新增早餐Breakfast、午餐Lunch、下午茶TeaTime…等,都只要寫入Food即可。三餐要吃什麼,餐點要增加什麼,全都由IoC控制即可。