【问题标题】:Google Guice return new instance every timeGoogle Guice 每次都返回新实例
【发布时间】:2018-10-16 05:50:31
【问题描述】:

我是依赖注入的新手,最近不得不学习 Spring 和 Guice。下面的问题可能很蹩脚。

Spring 允许您使用 @Scope("prototype") 注释创建原型对象,这意味着每次都会返回一个新对象

例如在我的弹簧容器中:-

@Scope("prototype")
@Bean
A getA(){
   return new A();
}

并且在@autowired的所有引用中都注入了一个新对象A。

class B {
  @Autowired
  A objA;
}

但是,在 guice 注入器中,正在注入相同的实例。看起来 guice 只提供单例、请求或会话范围 https://github.com/google/guice/wiki/Scopes。我的应用程序并不完全是一个 Web 服务,我想知道如何在各处注入对象的新实例。我读过可以使用提供程序,但找不到任何蹩脚/容易理解的例子。

如何将 A 的新实例注入 B 或任何其他类?使用 Guice,目前我只能在 guice 容器中注入以下所有类的相同实例

bind(A.Class).toInstance(new A());
new B(); // or create with other ways 

【问题讨论】:

    标签: dependency-injection guice


    【解决方案1】:

    所需的行为是 guice 的默认行为,因此您每次都会获得一个新实例,除非您明确切换到单例。

    这就是你在绑定到实例时所做的事情。您是在告诉 guice“每次有人需要 A 的实例,给他这个(通过‘new’创建的那个”。

    如果您只想在构建 B 时注入新的 A,请不要在模块中指定任何行为,只需让 A 有一个带有 @Inject 注释的构造函数。

    【讨论】:

      【解决方案2】:

      不使用绑定

      默认绑定每次注入时都会创建一个新实例。

      你不需要声明任何东西:

      import com.google.inject.*;
      
      class Main {
        static class B {
          @Inject A a;
        }
        public static void main(String[] args) {
          Injector injector = Guice.createInjector();
          B b1 = injector.getInstance(B.class);
          B b2 = injector.getInstance(B.class);
      
          System.out.println(b1.a == b2.a); // Prints "false"
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2016-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-19
        • 2022-01-23
        • 1970-01-01
        • 2017-10-07
        相关资源
        最近更新 更多