10 个开源的Java库

Guice(音同“juice”)是谷歌开发的一个轻量级的依赖注入框架,支持 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 ,  User guide ,  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

来自 Square 公司的 HTTP 客户端,类型案例,可用于 Android 和 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 , 网站

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

GitHub , 网站

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

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: “这是什么行?”

GitHub , 网站

Simple Logging Facade for Java

Simple Logging Facade for Java(SLF4J)是对各种日志框架(比如 java.util.logging、logback、log4j 等)的简单门面或者抽象,它让用户可以在开发时使用喜欢的日志框架。

简单地说,库和其它嵌入式组件考虑使用 SLF4J 来记录日志,因为它们不能把自己选用的日志框架强加给用户。另一方面,独立的应用程序就不必在意是否使用 SLF4J。独立的应用程序可以直接使用自己选用的日志框架。在使用 logback 的时候会有一个争议,因为它是使用 SLF4J 来提供日志 API 的。

网站 , 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 Parametrised 运行器的主要区别:

  • 更明确 - 参数是测试方法的参数,而不是类中定义的字段

  • 更少代码 - 不需要通过构造器来设置参数

  • 可以在一个类里混合参数化或非参数化的方法

  • 参数可以由 CSV 文本提供,也可以由专门的参数提供类提供

  • 参数提供类可以有任意多个参数提供方法,所以你可以对不同的情况分组

  • 可以由测试方法提供参数(而不是其它类或静态方法)

  • 可以在 IDE 中看到实际的参数值(JUnit 的 Parametrised 中只有连续编号的参数)

网站 , GitHub , 快速开始

Mockito

Java 中不错的 mock 框架

//You can mock concrete classes, not just interfaces
LinkedList mockedList = mock(LinkedList.class);

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

//following prints "first"
System.out.println(mockedList.get(0));

//following throws runtime exception
System.out.println(mockedList.get(1));

//following prints "null" because get(999) was not stubbed
System.out.println(mockedList.get(999));

//Although it is possible to verify a stubbed invocation, usually it's just redundant
//If your code cares what get(0) returns, then something else breaks (often even before verify() gets executed).
//If your code doesn't care what get(0) returns, then it should not be stubbed. Not convinced? See here.
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 , 网站

Awaitility

Awaitility 是一个小型的 DSL(领域专用语言),用于将异步操作同步化。

测试异步系统是件难事,不仅需要处理线程、超时和并发问题,测试代码的意图还可能被这些细节所掩盖。Awaitility 是一个 DSL,它能以一个简洁易读的方式表达异步系统要做的事情。

@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 , 网站

WireMock

模拟 HTTP 服务的工具

  • HTTP 响应头,匹配 URL、标题和正文模式

  • 验证请求

  • 在单元测试中运行、独立运行或作为 WAR 应用运行

  • 通过 Java API、JSON 文件或者通过 HTTP 获取的 JSON 来进行配置

  • 录制/回放存根

  • 故障注入

  • 针对每个请求的条件代理

  • 浏览器代码用于注入请求或更换请求

  • 有状态的行为

  • 可配置响应延迟

{
    "request": {
        "method": "GET",
        "url": "/some/thing"
    },
    "response": {
        "status": 200,
        "statusMessage": "Everything was just fine!"
    }
}
Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记和 Google 有关。使用该标记,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的主从集群,可以做读写分离。缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端 JOpenID JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签 利用Google:maps JSP标签就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据连接池 BoneCP BoneCP 是一个高性能的开源java数据连接池实现。它的设计初衷就是为了提高数据连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值