歡迎光臨
每天分享高質量文章

2018 年你不能錯過的 Java 類庫

點擊上方“芋道原始碼”,選擇“置頂公眾號”

技術文章第一時間送達!

原始碼精品專欄

 

來源:http://t.cn/R6S39Cj

各位讀者好,

這篇文章是在我看過 Andres Almiray 的一篇介紹文後,整理出來的。

因為內容非常好,我便將它整理成參考串列分享給大家, 同時附上各個庫的特性簡介和示例。

請欣賞!

Guice

Guice (發音同 ‘juice’) ,是一個 Google 開發的輕量級依賴性註入框架,適合 Java 6 以上的版本。

# Typical dependency injection
public class DatabaseTransactionLogProvider implements Provider<TransactionLog{
  @Inject Connection connection;

  public TransactionLog get() {
    return new DatabaseTransactionLog(connection);
  }
}
# FactoryModuleBuilder generates factory using your interface
public interface PaymentFactory {
   Payment create(Date startDate, Money amount);
 }

GitHub, JavaDoc, 使用指南, FactoryModuleBuilder

OkHttp

HTTP是現代應用程式實現網絡連接的途徑,也是我們進行資料和媒體交換的工具。高效使用HTTP能使你的東西加載更快,並節省帶寬。

OkHttp是一個非常高效的HTTP客戶端,預設情況下:

  • 支持HTTP/2,允許對同一主機的請求共用一個套接字。

  • 如果HTTP/2 不可用,連接池會減少請求延遲。

  • 透明的GZIP可以減少下載流量。

  • 響應的快取避免了重覆的網絡請求。

OkHttpClient client = new OkHttpClient();

String run(String url) throws IOException {
  Request request = new Request.Builder()
      .url(url)
      .build();

  Response response = client.newCall(request).execute();
  return response.body().string();
}

GitHub, Website

Retrofit

Retrofit 是 Square 下的型別安全的 HTTP 客戶端,支持 Android 和 Java 等,它能將你的 HTTP API 轉換為 Java 接口。

Retrofit 將 HTTP API 轉換為 Java 接口:

public interface GitHubService {
    @GET("users/{user}/repos")
    CalllistRepos(@Path("user") String user);
}

Retrofit 類實現 GitHubService 接口:

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com/")
    .build();

GitHubService service = retrofit.create(GitHubService.class);

來自 GitHubService 的每個 Call 都能產生為遠程 Web 服務產生一個異步或同步 HTTP 請求:

Call<List> repos = service.listRepos("octocat");

GitHub, Website

JDeferred

與JQuery類似的Java Deferred/Promise類庫

  • Deferred 物件和 Promise

  • Promise 回呼:.then(…), .done(…), .fail(…), .progress(…), .always(…)

  • 支持多個promises – .when(p1, p2, p3, …).then(…)

  • Callable 和 Runnable – wrappers.when(new Runnable() {…})

  • 使用 Executor 服務

  • 支持Java 泛型: Deferred, deferred.resolve(10);, deferred.reject(new Exception());,deferred.notify(0.80);,

  • 支持Android

  • Java 8 Lambda的友好支持

GitHu鏈接,官方網站鏈接

RxJava

RxJava – JVM的響應式編程擴展 – 是一個為Java虛擬機編寫的使用可觀察序列的構建異步的基於事件的程式的類庫。

它基於觀察者樣式實現對資料/事件的序列的支持,並添加了一些運算子,允許你以宣告式構建序列, 使得開發者無需關心底層的執行緒、同步、執行緒安全和併發資料結構。

RxJava最常見的一個用法就是在後臺執行緒運行一些計算和網絡請求,而在UI執行緒顯示結果(或者錯誤):

 Flowable.fromCallable(() -{
     Thread.sleep(1000); //  imitate expensive computation
     return "Done";
 })
   .subscribeOn(Schedulers.io())
   .observeOn(Schedulers.single())
   .subscribe(System.out::println, Throwable::printStackTrace);

 Thread.sleep(2000); // 

GitHub, Wiki

MBassador

MBassador是一個實現了發佈-訂閱樣式的輕量級的,高性能的事件總線。它易於使用,並力求功能豐富,易於擴展,而同時又保證資源的高效利用和高性能。

MBassador的高性能的核心是一個專業的資料結構,它提供了非阻塞的讀取器,並最小化寫入器的鎖爭用,因此併發讀寫訪問的性能衰減會是最小的。

  • 註解驅動的

  • 提供任何東西,慎重對待型別層次結構

  • 同步和異步的訊息傳遞

  • 可配置的取用型別

  • 訊息過濾

  • 封裝的訊息

  • 處理器的優先級

  • 自定義錯誤處理

  • 可擴展性

// Define your listener
class SimpleFileListener{
    @Handler
    public void handle(File msg){
      // do something with the file
    }
}

// somewhere else in your code
MBassador bus = new MBassador();
Object listener = new SimpleFileListener();
bus.subscribe (listener);
bus.post(new File("/tmp/smallfile.csv")).now();
bus.post(new File("/tmp/bigfile.csv")).asynchronously();

GitHub, Javadoc

Lombok專案

使用註解來減少Java中的重覆代碼,比如getter,setters,非空檢查,生成的Builder等。

  • val – 總算有了!無憂的final本地變數。

  • @NonNull – 或:我如何學會不再擔心並愛上了非空異常(NullPointerException)。

  • @Cleanup – 自動的資源管理:安全呼叫你的close() 方法,無需任何麻煩。

  • @Getter / @Setter – 再也不用寫 public int getFoo() {return foo;}了

  • @ToString – 無需啟動除錯器來檢查你的欄位:就讓Lombok來為你生成一個toString方法吧!

  • @EqualsAndHashCode – 實現相等的判斷變得容易了:它會從你的物件的欄位里為你生成hashCode和equals方法的實現。

  • @NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor – 定做建構式:為你生成各種各樣的建構式,包括無參的,每一個final或非空的欄位作為一個引數的,或者每一個欄位都作為引數的。

  • @Data – 所有的都同時生成:這是一個快捷方式,可以為所有欄位生成@ToString, @EqualsAndHashCode, @Getter註解,以及為所有非final的欄位生成``@Setter註解,以及生成@RequiredArgsConstructor!

  • @Value – 宣告一個不可變類變得非常容易。

  • @Builder – … 而且鮑伯是你叔叔:創建物件的無爭議且奢華的接口!

  • @SneakyThrows – 在以前沒有人丟擲檢查型異常的地方大膽的丟擲吧!

  • @Synchronized – 正確的實現同步:不要暴露你的鎖。

  • @Getter(lazy=true) 懶惰是一種美德!

  • @Log – 船長日誌,星曆24435.7: “那一行又是什麼呢?”

GitHub, Website

Java簡單日誌門面(SLF4J)

Java簡單日誌門面 (SLF4J) 為不同的日誌框架(比如java.util.logging, logback, log4j)提供了簡單的門面或者抽象的實現,允許最終用戶在部署時能夠接入自己想要使用的日誌框架。

簡言之,類庫和其他嵌入式的組件都應該考慮採用SLF4J作為他們的日誌需求,因為類庫無法將它們對日誌框架的選擇強加給最終用戶。另一方面,對於獨立的應用來說,就不一定需要使用SLF4J。獨立應用可以直接呼叫他們自己選擇的日誌框架。而對於logback來說,這個問題是沒有意義的,因為logback是通過SLF4J來暴露其日誌接口的。

Website, GitHub, FAQ

JUnitParams

對測試進行引數化,還不錯

       @Test
       @Parameters({"17, false"
                    "22, true" })
       public void personIsAdult(int age, boolean valid) throws Exception {
         assertThat(new Person(age).isAdult(), is(valid));
       }

與標準的JUnit 引數化運行器的區別如下:

  • 更明確 – 引數實在測試方法的引數中,而不是在類的欄位中

  • 更少的代碼 – 你不需要用建構式來設置引數

  • 你可以在同一個類混合使用引數化和非引數化的方法。

  • 引數可以通過一個CSV字串或者一個引數提供類傳入。

  • 引數提供類可以擁有盡可能多的引數提供方法,這樣你可以給不同的用例進行分類。

  • 你可以擁有可以提供引數的測試方法 (再也不需要外部類或者靜態類了)

  • 你可以在你的集成開發工具中看到實際的引數值(而在JUnit的Parametrised里,只有連續數目的引數)

官方網站,GitHub,快速入門

Mockito

Java里單元測試的非常棒(tasty)的模擬框架:

 //你可以模擬具體的類,而不只是接口
 LinkedList mockedList = mock(LinkedList.class);

 //打樁
 when(mockedList.get(0)).thenReturn("first");
 when(mockedList.get(1)).thenThrow(new RuntimeException());

 //以下代碼打印出"first"字串
 System.out.println(mockedList.get(0));

 //以下代碼丟擲運行時異
 System.out.println(mockedList.get(1));

 //以下代碼打印出"null",因為get(999)沒有被打樁
 System.out.println(mockedList.get(999));

 //儘管是可以驗證一個打過樁的呼叫,但通常是多餘的
 //如果你的代碼關心get(0)傳回值的內容,那麼其他東西就會中斷(往往在verify()執行之前就發生了)。
 //如果你的代碼不關心get(0)傳回值的內容,那麼它就不應該被打樁。不相信嗎?看看這裡。
 verify(mockedList).get(0);

官方網站, GitHub, 文件

Jukito

它結合了JUnit、Guice和Mockito的能力。 而且它還聽起來像一門很酷的武術。

  • 極大的減少了諸如自動mock的樣板,從而使測試更加易讀。

  • 可以使得測試能夠根據被測試的物件上的API的改變而彈性變化。

  • 標有@Inject註解的欄位會被自動註入,不需要擔心會遺忘掉它們

  • 使得將物件連接在一起變得容易,因此你可以將一個單元測試變成集成測試的一部分

@RunWith(JukitoRunner.class)
public class EmailSystemTest {

  @Inject EmailSystemImpl emailSystem;
  Email dummyEmail;

  @Before
  public void setupMocks(
      IncomingEmails incomingEmails,
      EmailFactory factory)
 
{
    dummyEmail = factory.createDummy();
    when(incomingEmails.count()).thenReturn(1);
    when(incomingEmails.get(0)).thenReturn(dummyEmail);
  }

  @Test
  public void shouldFetchEmailWhenStarting(
      EmailView emailView)
 
{
    // WHEN
    emailSystem.start();

    // THEN
    verify(emailView).addEmail(dummyEmail);
  }
}

GitHub, Website

Awaitility

Awaitility是一個小型的Java領域專用語言(DSL),用於對異步的操作進行同步。

測試異步的系統是比較困難的。不僅需要處理執行緒、超時和併發問題,而且測試代碼的本來意圖也有可能被這些細節所矇蔽。Awaitility是一個領域專用語言,可以允許你以一種簡潔且易讀的方式來表達異步系統的各種期望結果。

@Test
public void updatesCustomerStatus() throws Exception {
    // Publish an asynchronous event:
    publishEvent(updateCustomerStatusEvent);
    // Awaitility lets you wait until the asynchronous operation completes:
    await().atMost(5, SECONDS).until(customerStatusIsUpdated());
    ...
}

GitHub,入門, 用戶指南

Spock

企業級的測試和規範框架。

class HelloSpockSpec extends spock.lang.Specification {
  def "length of Spock's and his friends' names"() {
    expect:
    name.size() == length

    where:
    name     | length
    "Spock"  | 5
    "Kirk"   | 4
    "Scotty" | 6
  }
}  

GitHub, Website

WireMock

用於模擬HTTP服務的工具

  • 對HTTP響應進行打樁,可以匹配URL、essay-header頭信息和body內容的樣式

  • 請求驗證

  • 在單元測試里運行,但是是作為一個對立的行程或者一個WAR應用的形式

  • 可通過流暢的Java API、JSON檔案和基於HTTP的JSON進行配置

  • 對stub的錄製/回放

  • 故障註入

  • 針對每個請求的根據條件進行代理

  • 針對請求的檢查和替換進行瀏覽器的代理

  • 有狀態的行為模擬

  • 可配置的響應延遲

{
    "request": {
        "method""GET",
        "url""/some/thing"
    },
    "response": {
        "status"200,
        "statusMessage""Everything was just fine!"
    }
}

GitHub, Website

感謝

非常感謝閱讀!




如果你對 Dubbo / Netty 等等原始碼與原理感興趣,歡迎加入我的知識星球一起交流。長按下方二維碼噢

目前在知識星球更新了《Dubbo 原始碼解析》目錄如下:

01. 除錯環境搭建
02. 專案結構一覽
03. 配置 Configuration
04. 核心流程一覽

05. 拓展機制 SPI

06. 執行緒池

07. 服務暴露 Export

08. 服務取用 Refer

09. 註冊中心 Registry

10. 動態編譯 Compile

11. 動態代理 Proxy

12. 服務呼叫 Invoke

13. 呼叫特性 

14. 過濾器 Filter

15. NIO 服務器

16. P2P 服務器

17. HTTP 服務器

18. 序列化 Serialization

19. 集群容錯 Cluster

20. 優雅停機

21. 日誌適配

22. 狀態檢查

23. 監控中心 Monitor

24. 管理中心 Admin

25. 運維命令 QOS

26. 鏈路追蹤 Tracing

… 一共 69+ 篇

目前在知識星球更新了《Netty 原始碼解析》目錄如下:

01. 除錯環境搭建
02. NIO 基礎
03. Netty 簡介
04. 啟動 Bootstrap

05. 事件輪詢 EventLoop

06. 通道管道 ChannelPipeline

07. 通道 Channel

08. 位元組緩衝區 ByteBuf

09. 通道處理器 ChannelHandler

10. 編解碼 Codec

11. 工具類 Util

… 一共 61+ 篇

目前在知識星球更新了《資料庫物體設計》目錄如下:


01. 商品模塊
02. 交易模塊
03. 營銷模塊
04. 公用模塊

… 一共 17+ 篇

原始碼不易↓↓↓

點贊支持老艿艿↓↓

赞(0)

分享創造快樂