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 的其他有用特性是什么(尤其是不太明显的特性)?

4

3 回答 3

39

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

于 2010-04-27T04:47:59.803 回答
13

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

想要一些东西基本上是单例的,但每半小时从数据库中重新读取一次?为此创建一个范围很容易。想要在后台运行一些请求,并且有一个表示“所有后台请求都从同一个 HTTP 请求开始”的范围?写它Scope也相对容易。

想要Key在测试期间在您的服务器上设置一些范围,以便它为您从客户端运行的每个测试使用一个单独的实例?(通过 Cookie 或额外 HTTP 参数中的测试 id 的测试)这更难做到,但这是完全可能的,所以有人已经为你写了

是的,过度滥用Scope会导致 Jesse 开始四处寻找木桩和蒜瓣,但它惊人的灵活性确实很有用。

于 2010-04-27T15:59:11.990 回答
12

One great feature of Guice is how easy it makes implementing method interceptors in any Module, using:

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

Now, any method matching methodMatcher within a class matching classMatcher in that Module's scope is intercepted by interceptors.

For example:

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

Now, we can simply annotate any method with @Retryable and our RetryableInterceptor can retry it if it fails.

于 2010-06-24T05:14:24.833 回答