Google Guice的隐藏功能

时间:2010-04-26 21:22:30

标签: dependency-injection guice

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

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

e.g。

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的其他有用功能(特别是那些不太明显的功能)有哪些?

3 个答案:

答案 0 :(得分:39)

其中没有一个是隐藏的,但这些是Guice中我最喜欢的'奖励功能':

答案 1 :(得分:13)

我喜欢完全打开Scope界面:基本上,它只是从ProviderProvider的转换。 (好的,从KeyProviderProvider

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

想要在测试期间对服务器上的某些Key进行范围调整,以便它为您从客户端运行的每个测试使用单独的实例吗? (测试在Cookie或额外的HTTP参数中传递测试ID)这很难做,但它完全可能,所以someone's already written that for you

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

答案 2 :(得分:12)

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

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

现在,methodMatcher范围内的classMatcher范围内与Module匹配的类中匹配interceptors的任何方法都会被bindInterceptor( Matchers.any(), Matchers.annotatedWith(Retryable.class), new RetryableInterceptor()); 拦截。

例如:

@Retryable

现在,我们可以使用RetryableInterceptor和我们的{{1}}来简单地注释任何方法 如果失败则重试。