從Spring框架中學到的3種最佳實踐

毫無疑問,Spring 作爲最流行的Java框架之一,能夠通過提供諸如依賴注入(dependency injection)和控制反轉之類(inversion of control)的功能特性,可以非常輕鬆地創建實用的企業級Java應用程序。

但是坦白講,Spring 並不僅僅是一個DI和IOC框架。它通過提供一個有用的抽象層,

進一步簡化了許多Java 的API,例如JDBC、JMS、Java Mail等。它消除了Java開發人員在執行SQL語句和處理ResultSets以獲得所需的Java對象過程中面臨的大部分麻煩。這樣一來,使用Spring的JdbcTempalte和其他實用程序類來操作JDBC變得容易許多。

因此,在你學習Spring的時候,你學會不只是如何使用它,同時也對如何用Java編寫更好的代碼和一般的面向對象編程的一些有益的啓示。

在本文中,我將分享一些學習Spring時遇到的最佳實踐,主要是通過閱讀Craig Walls撰寫的經典的《 Spring in Action》一書和我自己對Spring的經驗心得。《 Spring in Action》這本書對我的影響特別大,因爲作者 Craig 優秀的寫作風格和他對Spring中每一個概念的獨特的講解方式。如果你還沒有拜讀過這本書,我強烈建議你去讀——它絕對值得你花時間和金錢去讀。

在不浪費讀者更多時間的情況下,以下是我學習到的三種最佳實踐,分享給大家,同時也建議每個Java程序員都應意識到下面提及的點,並在用Java編碼過程中有意識地應用。

1. 編碼接口

 

這是我在閱讀《 Head First Design Patterns 》(深入淺出設計模式)時首先學到的一個古老的OOP(Object Oriented Programming)指南。 這種OOP設計原理的主要目的是減少兩個類之間的耦合,從而增加靈活性。

Spring嚴格遵循面向對象的準則,並且暴露很多接口來使用關鍵類,例如,創建JdbcOperation接口以利用JdbcTemplate等等。 這種做法促進了不同層之間的鬆散耦合。

另一個不錯的例子是一個用於提供緩存Cache接口。所有其他緩存實現類都是實現了此接口,例如 EhCache,ConcurrentMapCache和NoOpCache。如果你的代碼是依賴於緩存接口,而不是任何特定的實現,那麼你就可以切換緩存提供者,而不會影響你的代碼的其他部分。

下面是一個使用Collection 集合框架在Java中編寫接口的簡單代碼示例。

1 import java.util.Arrays;
2 import java.util.List;
3 import java.util.stream.Collectors;
4
5 /**
6 * Program to demonstrate coding for interfaces in Java
7 * @author WINDOWS 8
8 */
9 public class Hello {
10
11 public static void main(String args[]) {
12 // Using interface as variable types
13 List<String> rawMessage = Arrays.asList("one", "two", "three");
14 List<String> allcaps = toCapitalCase(rawMessage);
15 System.out.println(allcaps);
16 }
17
18 /**
19 * Using Interface as type of argument and return type
20 */
21 public static List<String> toCapitalCase(List<String> messages) {
22 return messages.stream()
23 .map(String::toUpperCase)
24 .collect(Collectors.toList());
25 }
26 }

這是一個使用Collection框架爲Java中的接口編碼的簡單代碼示例。

2. 優先處理非檢查型異常,而不是檢查型異常

 

如果你使用過Spring框架,那麼便注意到Spring更傾向於處理非檢查型異常,而不是檢查型異常,最好的例子就是Spring JDBC。

Spring有一個豐富的異常層次結構來描述在連接數據庫和檢索數據時可能遇到的不同錯誤,但是這些錯誤的根源是DataAccessException,它是非檢查型異常。

Spring認爲,大多數錯誤是由於無法在catch塊中糾正的原因引起的,因此,它決定將異常捕獲給開發人員,而不是像Java那樣將其強制插入。這樣便促使沒有空的catch塊,甚至更少的try-catch塊,使得代碼更精簡凝練的。

這也是處理Java中的錯誤和異常時的最佳實踐之一。 如果對該主題感興趣,那麼可以查看我的文章《 10 Java Exception best practice 》,以獲得更多建議。

 

3.模板設計模式的使用

 

Spring大量使用設計模式中的模板方法來簡化事情。這方面的一個很好的例子是JdbcTemplate,它在使用JDBC API時省去了很多麻煩。您只需要定義它需要什麼,而Spring負責處理流程的其餘部分。

不知你是否知曉,模板模式定義的過程或算法,我們雖不能改變其過程,但是卻可以根據實際需要自定義步驟。

例如,在處理JDBC時,可以使用JdbcTemplate執行查詢並獲取所需的對象。 你只需要提供在每種情況下都不同的SQL,以及用於從一個表中的行映射到對象的映射邏輯。

下面的圖很好地解釋了模板模式。你可以看到雖然每個人做不同的工作,但是他們都有一些共同的任務,這被一個模板方法很好地捕獲了。這個模板方法需要做的就是定義他們的工作,可以通過定義work()抽象方法來實現。

除了JdbcTemplate之外,在Spring的API中還可以發現許多其他使用模板方法模式的例子,例如JmsTemplate和RestTemplate,它們允許使用來自Java應用程序的REST API。

以上就是可以從Spring學到的Java最佳實踐。Spring是一個很棒的框架,其作者都是經驗豐富的Java開發人員。通過使用Spring以及查看他們的代碼、決策以及如何設計API,你可以學到很多東西。Spring是開源的,所以可以下載並查看它們的源代碼。

 

我知道Spring是許多這樣的最佳實踐的集合,還有很多需要學習,但是我發現這三種實踐在Spring中隨處可見,這對Spring框架的代碼質量產生了巨大的影響。

如果您遇到了從Spring中學到的其他最佳實踐,請隨時與我們分享。

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