Google Guice的隐藏功能

Jon*_*Jon 27 dependency-injection guice

Google Guice提供了一些很棒的依赖注入功能.

我最近遇到了@Nullable特性,它允许你将构造函数参数标记为可选(允许为null),因为Guice默认不允许这些:

例如

public Person(String firstName, String lastName, @Nullable Phone phone) {
    this.firstName = checkNotNull(firstName, "firstName");
    this.lastName = checkNotNull(lastName, "lastName");
    this.phone = phone;
}
Run Code Online (Sandbox Code Playgroud)

https://github.com/google/guice/wiki/UseNullable

Guice的其他有用功能(特别是不那么明显的)人们使用了什么?

Jes*_*son 39

它们都不是隐藏的,但这些是Guice中我最喜欢的'奖励功能':


Dan*_*tin 13

我喜欢如何完全开放的Scope接口:基本上,它只是一个转变,从ProviderProvider.(好,由KeyProviderProvider)

希望有些东西基本上是Singleton,但每半小时从数据库重新读取一次?很容易为此做好准备.想在后台运行一些请求,并且有一个范围意味着"所有后台请求都是从同一个HTTP请求启动的?" 写它Scope也相对容易.

想要Key在测试期间对服务器上的某些内容进行范围调整,以便它为您从客户端运行的每个测试使用单独的实例?(测试在Cookie或额外的HTTP参数中传递测试ID)这很难做,但它完全有可能,所以有人已经为你写了.

是的,过度滥用Scope将导致Jesse开始寻找赌注和大蒜丁香,但其惊人的灵活性可能非常有用.


dyr*_*oss 12

Guice的一个重要特性是它在任何方面实现方法拦截器是多么容易Module,使用:

public void bindInterceptor(
    Matcher<? super Class<?>> classMatcher,
    Matcher<? super Method> methodMatcher,
    MethodInterceptor... interceptors);
Run Code Online (Sandbox Code Playgroud)

现在,在该范围methodMatcher内匹配的类中匹配的任何方法都被截获.classMatcherModuleinterceptors

例如:

bindInterceptor(
    Matchers.any(),
    Matchers.annotatedWith(Retryable.class),
    new RetryableInterceptor());
Run Code Online (Sandbox Code Playgroud)

现在,我们可以简单地注释任何方法,如果失败@Retryable,我们RetryableInterceptor可以重试它.