(出处: 葡萄城产品技术社区)
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(); } 复制代码 ----------------------------------------------------------------------------------------------------------------------------- Retrofit Retrofit 是 Square 下的类型安全的 HTTP 客户端,支持 Android 和 Java 等,它能将你的 HTTP API 转换为 Java 接口。 Retrofit 将 HTTP API 转换为 Java 接口: public interface GitHubService { @GET("users/{user}/repos") Call<List<Repo>listRepos(@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<Repo>> 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<Integer, Exception, Doubledeferred;, 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); // <--- wait for the flow to finish 复制代码 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 The combined power of JUnit, Guice, and Mockito. Plus it sounds like a cool martial art. Greatly reduces boilerplate via automocking, leading to easier to read tests Leads to tests that are more resilient to API changes in the tested objects Fields annotated with @Inject are automatically injected, no risk to forget them Makes it easy to wire objects together, so you can scale a unit test to a partial integration test @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 原文链接: https://coyee.com/article/11950-java-libraries-you-can-t-miss-in-2017