我想介绍Guice用于现有的中型项目。对于我的需求,我需要一个自定义范围(会话太大,而请求对我的项目小)。
假设我请求向导为我提供一个类A的实例,该实例直接或间接依赖于许多其他类(组合)。
我的自定义提供程序能够提供类的实例,这些实例被用作所有相关类的构造函数参数。
问题:
- 我真的必须把
@Inject
(和我的自定义作用域)注释放在所有涉及的类或的构造函数上吗?是否有一种方法,引导只需要这些注释在顶层类上,我请求并且所有进一步的依赖关系都通过"询问"我的自定义作用域来解决依赖类型的提供者?
如果这是真的,这将增加引入Guice的工作量,因为我必须调整超过1000个类。在介绍guice的过程中,任何帮助和经验都是值得感谢的。
首先,可以在不放置@Inject
注释的情况下使用Guice。Guice支持Provider绑定、@ providers方法和构造函数绑定,所有这些都允许你按照自己的选择绑定类型。然而,对于它的正常操作,它需要@Inject
注释作为元数据,告诉它一个类需要什么依赖关系,以及它可以在哪里注入它们。
这样做的原因是,否则,它不能确定地告诉它应该注入什么以及在哪里注入。例如,类可能有多个构造函数,Guice需要某种方法来选择一个注入,而不依赖于任何猜测。你可以说"好吧,我的类只有一个构造函数,所以它不应该需要@Inject
",但是当有人向一个类添加一个新的构造函数时会发生什么呢?那么Guice就不再有决策的基础,应用程序就会中断。此外,这一切都假定您只做构造函数注入。虽然构造函数注入通常是最好的选择,但Guice也允许注入方法(和字段),并且需要显式指定类的注入点的问题更严重,因为大多数类将有许多不用于注入的方法,最多有几个用于注入的方法。
除了@Inject
在告诉Guice方面的重要性之外,它还可以作为如何使用类的文档——类是应用程序依赖注入有线基础结构的一部分。在跨类应用@Inject
注释时,保持一致也很有帮助,即使目前对于一些只使用单个构造函数的类来说,这不是绝对必要的。我还注意到,如果标准Java注释比特定于Guice的注释更可取,则可以在Guice 3.0中使用JSR-330的@javax.inject.Inject
注释。
我不太清楚你所说的为提供者询问作用域是什么意思。作用域本身通常不创建对象;它们控制何时向没有作用域的依赖提供程序请求新实例的作用域,以及如何控制该实例的作用域。当然,提供者是他们运作方式的一部分,但我不确定这是否是你的意思。如果你有一些自定义的方式来提供对象的实例,Provider
绑定和@Provides
方法是实现这一目标的方式,并且不需要在类本身上使用@Inject
注释。
NO YOU don ' t
GUICE不要求你注入每一个对象。GUICE将尝试只创建注入的对象。你可以@Inject你想要被注入的对象。
在作用域位上-作用域本质上控制GUICE如何创建对象。当您编写自己的自定义作用域时,您可以拥有控制对象创建方式的数据结构。当您使用自定义注释对类进行作用域时,GUICE将在为该类创建Provider之前调用您的作用域方法。然后,您可以决定是要创建新对象还是使用来自数据结构(如hashmap或其他)的现有对象。如果您想使用现有的对象,则获取该对象并返回该对象,否则执行provider.get()并返回。
注意
public <T> Provider<T> scope(final Key<T> key, final Provider<T> unscoped) {
return new Provider<T>() {
public T get() {
Map<Key<?>, Object> scopedObjects = getScopedObjectMap(key);
@SuppressWarnings("unchecked")
T current = (T) scopedObjects.get(key);
if (current == null && !scopedObjects.containsKey(key)) {
current = unscoped.get();
scopedObjects.put(key, current);
}
// what you return here is going to be injected ....
// in this scope object you can have a datastructure that holds all references
// and choose to return that instead depending on your logic and external
// dependencies such as session variable etc...
return current;
}
};
}
这是一个教程…
http://code.google.com/p/google-guice/wiki/CustomScopes在最基本的级别上,@Inject
注释标识了需要为您设置的内容指南。可以将guice直接注入到字段、方法或构造函数中。每次想要向导注入对象时,必须使用@Inject
注释。