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的其他有用功能(特别是那些不太明显的功能)有哪些?
答案 0 :(得分:39)
其中没有一个是隐藏的,但这些是Guice中我最喜欢的'奖励功能':
答案 1 :(得分:13)
我喜欢完全打开Scope
界面:基本上,它只是从Provider
到Provider
的转换。 (好的,从Key
和Provider
到Provider
)
想要一些事情基本上是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}}来简单地注释任何方法
如果失败则重试。