谷歌Guice的隐藏功能

27

Google Guice提供了一些很好的依赖注入功能。

最近我发现了@Nullable的特性,它允许您将构造函数参数标记为可选的(允许为空),因为Guice默认情况下不允许这样做:

例如:

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

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

Guice有哪些其他实用的功能(特别是那些不太明显的功能)被人们使用了呢?


6
这怎么是个隐藏功能?它在最佳实践指南中,离主页面只有两次点击。 - Matthew Flaschen
1
如果你想要严谨一点的话,其实是三个...! - Jonathan Holloway
3个回答

39

这些都不是为了隐藏而设计的,但以下是我在Guice中最喜欢的“额外功能”:


13

我喜欢Scope接口的开放性:基本上,它只是从ProviderProvider的转换。(好吧,从KeyProviderProvider)

想要一些东西基本上是单例的,但每半个小时从数据库重新读取?很容易为此创建一个作用域。想要在后台运行一些请求,并有一个作用域表示“所有从同一HTTP请求启动的后台请求”?也相对容易编写该Scope

想要在测试中针对服务器对某些Key进行定位,以便它使用客户端运行的每个测试的单独实例?(测试通过Cookie或额外的HTTP参数传递测试ID)这样做更难,但完全可能,因此已经有人为您编写了代码

是的,过度滥用Scope会导致Jesse开始四处寻找木桩和大蒜,但其惊人的灵活性可以非常有用。


12

Guice 的一个很棒的特性是,它使得在任何 Module 中实现方法拦截器变得非常容易,可以使用如下方式:

public void bindInterceptor(
    Matcher<? super Class<?>> classMatcher,
    Matcher<? super Method> methodMatcher,
    MethodInterceptor... interceptors);

现在,任何在Module范围内与classMatcher匹配的类中与methodMatcher匹配的方法都会被interceptors拦截。

例如:

bindInterceptor(
    Matchers.any(),
    Matchers.annotatedWith(Retryable.class),
    new RetryableInterceptor());

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接