2010-04-26 176 views
26

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

例如:

我整个@Nullable功能最近,它允许您标记构造函数的参数为​​可选(允许为空),因为吉斯默认情况下不会允许这些来

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

什么是人使用吉斯(尤其是不太明显的)的其他有用的功能?的

+6

这是一个隐藏的功能?这是最佳做法指南,即从主页面点击两次。 – 2010-04-26 21:29:01

+1

实际上,如果你想对它进行迂腐......! – Jon 2010-04-26 23:56:33

回答

39

无“时间都用来被隐藏,但这些都是我的最爱‘在吉斯奖金特点’:

  • 吉斯可以inject a TypeLiteral<T>,有效地击败擦除。
  • TypeLiteral可以做generic type resolution:这告诉你get()在列表上<字符串>返回一个迭代器<字符串>。
  • Types是Java的泛型类型接口实现的工厂。
  • Grapher可视化注射器。如果您的自定义提供商实施了HasDependencies,则可以增加此图表。
  • Modules.override()非常方便在捏。
  • 定义参数化键的简短语法:新键<列表<字符串> >(){}。
  • Binder.skipSources()允许您编写扩展,其中的错误消息正确地跟踪行号。
  • The SPIElements.getElements()将模块分解为原子,并将其放回原处。
  • 如果在模块中实现equals()和hashCode(),则可以多次安装该模块而不会出现问题。
13

我怎么样完全打开Scope接口:基本上,它只是从ProviderProvider转型。 (好吧,从KeyProviderProvider

想要一些东西基本上是Singleton,但每半小时重新从数据库读取?为此制定一个范围很容易。想要在后台运行一些请求,并且有一个范围,意思是“所有后台请求都从相同的HTTP请求开始?”编写这个文件也相对容易一些。

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

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

+1

这两个都是真的! – 2010-04-27 16:39:32

12

吉斯的一个大特点是它使多么容易在任何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可以 重试。