提示:我是否必须用@Inject来注释对象图的每个类?



我想介绍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注释。

最新更新