【问题标题】:Hidden Features of Google Guice [closed]Google Guice 的隐藏功能 [关闭]
【发布时间】:2010-04-26 21:22:29
【问题描述】:

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

【问题讨论】:

  • 这是一个隐藏功能吗?它位于最佳实践指南中,从主页单击两次即可。
  • 其实是三个,如果你想学究气的话......!

标签: dependency-injection guice


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    想要在测试期间在您的服务器上设置Key 的范围,以便它为您从客户端运行的每个测试使用一个单独的实例? (通过 Cookie 或额外 HTTP 参数中的测试 id 进行测试)这更难做到,但这是完全可能的,所以someone's already written that for you

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

    【讨论】:

      【解决方案3】:

      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 可以 如果失败,请重试。

      【讨论】:

        猜你喜欢
        • 2010-09-08
        • 2011-02-03
        • 2010-09-08
        • 2010-10-25
        • 2011-06-25
        • 2010-12-11
        • 2012-08-24
        • 2011-11-07
        • 2014-08-13
        相关资源
        最近更新 更多