Java Spring白話文。淺談學習Java Spring的心得

Jun
appxtech
Published in
7 min readAug 14, 2020

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控制即可。

Spring Framework(框架),有著不同的模組,應用在各個不同的方面。透過Spring的模組,把許多繁雜的底層部份(程式及流程)都已經代為處理好,讓程式人員能簡單的使用,Spring讓程式整體在開發及維護上,能更加的有效率。

--

--