彩票走势图

2017 年不容错过的开源 Java 库

原创|行业资讯|编辑:郝浩|2017-03-02 17:07:20.000|阅读 156 次

概述:这些开源库非常棒,我已经将它们整理成参考清单,附上简短的功能清单连同案例一同分享。

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

这些开源库非常棒,我已经将它们整理成参考清单,附上简短的功能清单连同案例一同分享。 

Guice 

Guice(音同“juice”)是谷歌开发的一个轻量级的依赖注入框架,支持 java 6 及以上版本。   

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

 

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

 

OkHttp 

HTTP 是现代应用程序实现互联的机制。数据和媒体的交互都基于此。高效的 http 机制能提升你的下载速度和节约带宽。  OkHttp 作为一个HTTP客户端,默认:  HTTP/2 服务默认发往同一台主机的所有请求共用一个套接字。  连接池减少请求的延迟(如 HTTP/2 不可用)。  gzip 压缩下载大小可见。  通过响应缓存完全避免了网络的重复请求。 

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

 

Retrofit 

来自 Square 公司的 HTTP 客户端,类型案例,可用于 Android 和 Java。Retrofit 会按照 HTTP API 生成 Java 接口。 

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

Retrofit 类实现 GitHubService 接口。 

Java代码 
  1. <pre class="java" name="code"><pre class="java" name="code">Retrofit retrofit = new Retrofit.Builder()  
  2.     .baseUrl("//api.github.com/")  
  3.     .build();  
  4.    
  5. GitHubService service = retrofit.create(GitHubService.class);</pre></pre>  

来自 GitHubService 的每个 Call 都会向远端 Web 服务器发送一个同步或异步的 HTTP 请求。 

Java代码 
  1. 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<Integer, Exception, Doubledeferred;, deferred.resolve(10);, deferred.reject(new Exception());,deferred.notify(0.80);,
  • 支持 Android
  • 可以使用 Java 8 Lambda

 

RxJava 

RxJava – JVM 的 Reactive Extensions (响应式扩展) – 一个用于 Java VM 的库,它通过可观测序列构成异步及基于事件的程序。  它扩展了观察者模式以支持数据/事件流,并添加了操作符,使你能以申明的方式组合处理序列,对一些事情进行抽象,比如低级线程、同步、线程安全和并发数据结构。  RxJava 常见的应用是在后台线程运行一些计算或网络请求,并在 UI 线程显示结果(或错误): 

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

 

MBassador 

MBassador 是一个轻量级、高性能的事件总线,它实现了发布/订阅模式。它的设计目的是易用、功能丰富和可扩展,同时保持资源的高效利用和良好性能。  MBassador 高性能的核心在于一个专用的数据结构,这个数据结构提供了非阻塞读功能以及在写时最小化锁竞争,因此它将并行读/写访问造成的性能损耗降到最低。 

  • 注解驱动
  • 分发的所有东西都会考虑类型层级
  • 同步和异步的消息分发
  • 可配置的引用类型
  • 消息过滤
  • 封装消息
  • 多级优先层次处理
  • 自定义错误处理
Java代码 
  1. // Define your listener  
  2. class SimpleFileListener{  
  3.     @Handler      
  4.      public void handle(File msg){  
  5.       // do something with the file      
  6.     }  
  7. }  
  8.   
  9. // somewhere else in your codeMBassador bus = new MBassador();  
  10. Object listener = new SimpleFileListener();  
  11. bus.subscribe (listener);  
  12. bus.post(new File("/tmp/smallfile.csv")).now();  
  13. bus.post(new File("/tmp/bigfile.csv")).asynchronously();  

 

Project Lombok 

通过注解来减少 Java 中的重复性代码,比如 getter 和 setter、非空检查、生成 Builder 等。&nbsp;

  • 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  参数化测试 

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

与标准 JUnit Parametrised 运行器的主要区别: 

  • 更明确 - 参数是测试方法的参数,而不是类中定义的字段
  • 更少代码 - 不需要通过构造器来设置参数
  • 可以在一个类里混合参数化或非参数化的方法
  • 参数可以由 CSV 文本提供,也可以由专门的参数提供类提供
  • 参数提供类可以有任意多个参数提供方法,所以你可以对不同的情况分组
  • 可以由测试方法提供参数(而不是其它类或静态方法)
  • 可以在 IDE 中看到实际的参数值(JUnit 的 Parametrised 中只有连续编号的参数)

 

Mockito 

Java 中不错的 mock 框架 

Java代码 
  1. //You can mock concrete classes, not just interfaces  
  2. LinkedList mockedList = mock(LinkedList.class);  
  3.   
  4. //stubbing  
  5. when(mockedList.get(0)).thenReturn("first");  
  6. when(mockedList.get(1)).thenThrow(new RuntimeException());  
  7.   
  8. //following prints "first"  
  9. System.out.println(mockedList.get(0));  
  10.   
  11. //following throws runtime exception  
  12. System.out.println(mockedList.get(1));  
  13.   
  14. //following prints "null" because get(999) was not stubbed  
  15. System.out.println(mockedList.get(999));  
  16.   
  17. //Although it is possible to verify a stubbed invocation, usually it's just redundant  
  18. //If your code cares what get(0) returns, then something&nbsp;else breaks (often even before verify() gets executed).  
  19. //If your code doesn't care what get(0) returns, then it should not be stubbed. Not convinced? See here.  
  20. verify(mockedList).get(0);  

 

Jukito 

  • 结合了 JUnit、Guice 和 Mockito 的力量,听起来很有技术含量。
  • 大大降低了自动 mock 的古板,使阅读测试变得容易
  • 在测试对象的 API 变化时更有弹性
  • 通过 @Inject 注解的字段可以自动注入
  • 更容易将对象绑在一起,因此可以将单元测试扩展到部分集成测试
Java代码 
  1. @RunWith(JukitoRunner.class)  
  2. public class EmailSystemTest {  
  3.   
  4.   @Inject EmailSystemImpl&nbsp;emailSystem;  
  5.   Email dummyEmail;  
  6.   
  7.   @Before  
  8.   public void setupMocks(  
  9. &nbsp;     IncomingEmails incomingEmails,  
  10.   &nbsp; &nbsp; EmailFactory factory) {  
  11.     dummyEmail = factory.createDummy();  
  12.     when(incomingEmails.count()).thenReturn(1);  
  13.     when(incomingEmails.get(0)).thenReturn(dummyEmail);  
  14.   }  
  15.   
  16.   @Test  
  17.   public void shouldFetchEmailWhenStarting(  
  18.    &nbsp;  EmailView emailView) {  
  19.     // WHEN  
  20.     emailSystem.start();  
  21.   
  22.     // THEN  
  23.     verify(emailView).addEmail(dummyEmail);  
  24.   }  
  25. }  

 

Awaitility 

Awaitility 是一个小型的 DSL(领域专用语言),用于将异步操作同步化。  测试异步系统是件难事,不仅需要处理线程、超时和并发问题,测试代码的意图还可能被这些细节所掩盖。Awaitility 是一个 DSL,它能以一个简洁易读的方式表达异步系统要做的事情。 

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

 

Spock 

用于企业的测试和规范框架。 

Java代码 
  1. class HelloSpockSpec extends spock.lang.Specification {  
  2.   def "length of Spock's and his friends' names"() {  
  3.     expect:  
  4.  &nbsp; &nbsp;name.size() == length  
  5.   
  6.     where:  
  7.  &nbsp;  name    &nbsp;| length  
  8.     "Spock"  | 5  
  9.     "Kirk"   | 4  
  10.     "Scotty" | 6  
  11.   }  
  12. }  

 

WireMock 

  • 模拟 HTTP 服务的工具
  • HTTP 响应头,匹配 URL、标题和正文模式
  • 验证请求
  • 在单元测试中运行、独立运行或作为 WAR 应用运行
  • 通过 Java API、JSON 文件或者通过 HTTP 获取的 JSON 来进行配置
  • 录制/回放存根
  • 故障注入
  • 针对每个请求的条件代理
  • 浏览器代码用于注入请求或更换请求
  • 有状态的行为
  • 可配置响应延迟
Java代码 
  1. {  
  2.     "request": {  
  3.         "method""GET",  
  4.         "url""/some/thing"  
  5.     },  
  6.     "response": {  
  7.         "status"200,  
  8.         "statusMessage""Everything was just fine!"  
  9.     }  
  10. }  

原文:

转载自:


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@cahobeh.cn


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP