乾貨——Java培訓老師會才告訴你的 10+ 個開源 Java 庫

若是你去參加Java培訓,這十個開源庫是老師必定會告訴你的!如今大把乾貨一次全給你!html

 

Guicejava

Guice(音同「juice」)是谷歌開發的一個輕量級的依賴注入框架,支持 java 6 及以上版本。git

  1.  
  2. # Typical dependency injection
  3. public class DatabaseTransactionLogProvider implements Provider<TransactionLog> {
  4. @Inject Connection connection;
  5.  
  6. public TransactionLog get() {
  7. return new DatabaseTransactionLog(connection);
  8. }
  9. }

 

  1.  
  2. # FactoryModuleBuilder generates factory using your interface
  3. public interface PaymentFactory {
  4. Payment create(Date startDate, Money amount);
  5. }

 

OkHttpgithub

HTTP 是現代應用程序實現互聯的機制。數據和媒體的交互都基於此。高效的 http 機制能提高你的下載速度和節約帶寬。api

OkHttp 做爲一個HTTP客戶端,默認:瀏覽器

HTTP/2 服務默認發往同一臺主機的全部請求共用一個套接字。緩存

鏈接池減小請求的延遲(如 HTTP/2 不可用)。安全

gzip 壓縮下載大小可見。服務器

經過響應緩存徹底避免了網絡的重複請求。網絡

  1.  
  2. OkHttpClient client = new OkHttpClient();String run(String url) throws IOException {
  3. Request request = new Request.Builder()
  4. .url(url)
  5. .build();
  6.  
  7. Response response = client.newCall(request).execute();
  8. return response.body().string();
  9. }

 

Retrofit

來自 Square 公司的 HTTP 客戶端,類型案例,可用於 Android 和 Java。Retrofit 會按照 HTTP API 生成 Java 接口。

  1.  
  2. public interface GitHubService {
  3. @GET("users/{user}/repos")
  4. Call<List<Repo>listRepos(@Path("user") String user);
  5. }

 

Retrofit 類實現 GitHubService 接口。

  1.  
  2. Retrofit retrofit = new Retrofit.Builder()
  3. .baseUrl("https://api.github.com/")
  4. .build();
  5.  
  6. GitHubService service = retrofit.create(GitHubService.class);

 

來自 GitHubService 的每一個 Call 都會向遠端 Web 服務器發送一個同步或異步的 HTTP 請求。

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

 

JDeferred

Java 的 Deferred/Promise 庫,與 JQuery 的 Deferred/Promise 類似

Deferred 和 Promise 對象 Promise 回調:.then(…), .done(…), .fail(…), .progress(…), .always(…) 同時處理多個 Promise - .when(p1, p2, p3, …).then(…) Callable 和 Runnable - wrappers.when(new Runnable() {…}) 使用執行服務(ExecutorService) Java Generics 支持: Deferred

RxJava

RxJava – JVM 的 Reactive Extensions (響應式擴展) – 一個用於 Java VM 的庫,它經過可觀測序列構成異步及基於事件的程序。

它擴展了觀察者模式以支持數據/事件流,並添加了操做符,使你能以申明的方式組合處理序列,對一些事情進行抽象,好比低級線程、同步、線程安全和併發數據結構。

RxJava 常見的應用是在後臺線程運行一些計算或網絡請求,並在 UI 線程顯示結果(或錯誤):

  1.  
  2. Flowable.fromCallable(() -{
  3. Thread.sleep(1000); // imitate expensive computation return "Done";
  4. })
  5. .subscribeOn(Schedulers.io())
  6. .observeOn(Schedulers.single())
  7. .subscribe(System.out::println, Throwable::printStackTrace);
  8.  
  9. Thread.sleep(2000); // <--- wait for the flow to finish

 

 

MBassador

MBassador 是一個輕量級、高性能的事件總線,它實現了發佈/訂閱模式。它的設計目的是易用、功能豐富和可擴展,同時保持資源的高效利用和良好性能。

MBassador 高性能的核心在於一個專用的數據結構,這個數據結構提供了非阻塞讀功能以及在寫時最小化鎖競爭,所以它將並行讀/寫訪問形成的性能損耗降到最低。

註解驅動 分發的全部東西都會考慮類型層級 同步和異步的消息分發 可配置的引用類型 消息過濾 封裝消息 多級優先層次處理 自定義錯誤處理

  1.  
  2. // Define your listener
  3. class SimpleFileListener{
  4. @Handler
  5. public void handle(File msg){
  6. // do something with the file
  7. }
  8. }
  9.  

10. // somewhere else in your codeMBassador bus = new MBassador();

11. Object listener = new SimpleFileListener();

12. bus.subscribe (listener);

13. bus.post(new File("/tmp/smallfile.csv")).now();

14. bus.post(new File("/tmp/bigfile.csv")).asynchronously();

 

 

Project Lombok

經過註解來減小 Java 中的重複性代碼,好比 getter 和 setter、非空檢查、生成 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 - … 一切都很簡單:簡單直接地建立對象的 API! @SneakyThrows - 大膽的拋出之前不能輕易拋出的異常! @synchronized - 正確的同步:不要暴露你的鎖。 @Getter(lazy=true) 懶加載是種美德! @Log - 艦長日誌,星曆 24435.7: 「這是什麼行?」

Simple Logging Facade for Java

Simple Logging Facade for Java(SLF4J)是對各類日誌框架(好比 java.util.logging、logback、log4j 等)的簡單門面或者抽象,它讓用戶能夠在開發時使用喜歡的日誌框架。

簡單地說,庫和其它嵌入式組件考慮使用 SLF4J 來記錄日誌,由於它們不能把本身選用的日誌框架強加給用戶。另外一方面,獨立的應用程序就沒必要在乎是否使用 SLF4J。獨立的應用程序能夠直接使用本身選用的日誌框架。在使用 logback 的時候會有一個爭議,由於它是使用 SLF4J 來提供日誌 API 的。

JUnitParams

參數化測試

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

 

 

與標準 JUnit Parametrised 運行器的主要區別:

更明確 - 參數是測試方法的參數,而不是類中定義的字段 更少代碼 - 不須要經過構造器來設置參數 能夠在一個類裏混合參數化或非參數化的方法 參數能夠由 CSV 文本提供,也能夠由專門的參數提供類提供 參數提供類能夠有任意多個參數提供方法,因此你能夠對不一樣的狀況分組 能夠由測試方法提供參數(而不是其它類或靜態方法) 能夠在 IDE 中看到實際的參數值(JUnit 的 Parametrised 中只有連續編號的參數)

Mockito

Java 中不錯的 mock 框架

  1.  
  2. //You can mock concrete classes, not just interfaces
  3. LinkedList mockedList = mock(LinkedList.class);
  4.  
  5. //stubbing
  6. when(mockedList.get(0)).thenReturn("first");
  7. when(mockedList.get(1)).thenThrow(new RuntimeException());
  8.  
  9. //following prints "first"

10. System.out.println(mockedList.get(0));

  1. 11.  

12. //following throws runtime exception

13. System.out.println(mockedList.get(1));

  1. 14.  

15. //following prints "null" because get(999) was not stubbed

16. System.out.println(mockedList.get(999));

  1. 17.  

18. //Although it is possible to verify a stubbed invocation, usually it's just redundant

19. //If your code cares what get(0) returns, then something else breaks (often even before verify() gets executed).

20. //If your code doesn't care what get(0) returns, then it should not be stubbed. Not convinced? See here.

21. verify(mockedList).get(0);

 

 

Jukito

結合了 JUnit、Guice 和 Mockito 的力量,聽起來頗有技術含量。 大大下降了自動 mock 的古板,使閱讀測試變得容易 在測試對象的 API 變化時更有彈性 經過 @Inject 註解的字段能夠自動注入 更容易將對象綁在一塊兒,所以能夠將單元測試擴展到部分集成測試

  1.  
  2. @RunWith(JukitoRunner.class)
  3. public class EmailSystemTest {
  4.  
  5. @Inject EmailSystemImpl emailSystem;
  6. Email dummyEmail;
  7.  
  8. @Before
  9. public void setupMocks(

10. IncomingEmails incomingEmails,

11. EmailFactory factory) {

12. dummyEmail = factory.createDummy();

13. when(incomingEmails.count()).thenReturn(1);

14. when(incomingEmails.get(0)).thenReturn(dummyEmail);

15. }

  1. 16.  

17. @Test

18. public void shouldFetchEmailWhenStarting(

19. EmailView emailView) {

20. // WHEN

21. emailSystem.start();

  1. 22.  

23. // THEN

24. verify(emailView).addEmail(dummyEmail);

25. }

26. }

 

 

Awaitility

Awaitility 是一個小型的 DSL(領域專用語言),用於將異步操做同步化。

測試異步系統是件難事,不只須要處理線程、超時和併發問題,測試代碼的意圖還可能被這些細節所掩蓋。Awaitility 是一個 DSL,它能以一個簡潔易讀的方式表達異步系統要作的事情。

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

 

 

Spock

用於企業的測試和規範框架。

  1.  
  2. class HelloSpockSpec extends spock.lang.Specification {
  3. def "length of Spock's and his friends' names"() {
  4. expect:
  5. name.size() == length
  6.  
  7. where:
  8. name | length
  9. "Spock" | 5

10. "Kirk" | 4

11. "Scotty" | 6

12. }

13. }

 

 

WireMock

模擬 HTTP 服務的工具 HTTP 響應頭,匹配 URL、標題和正文模式 驗證請求 在單元測試中運行、獨立運行或做爲 WAR 應用運行 經過 Java API、JSON 文件或者經過 HTTP 獲取的 JSON 來進行配置 錄製/回放存根 故障注入 針對每一個請求的條件代理 瀏覽器代碼用於注入請求或更換請求 有狀態的行爲 可配置響應延遲

  1.  
  2. {
  3. "request": {
  4. "method": "GET",
  5. "url": "/some/thing"
  6. },
  7. "response": {
  8. "status": 200,
  9. "statusMessage": "Everything was just fine!"

10. }

11. }

 

 

 

 

原文:Java libraries you can't miss in 2017

譯者:邊城, Tocy, butta

相關文章
相關標籤/搜索