我是Dependency Injection的新手,最近不得不学习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
答案 0 :(得分:2)
所需行为是guice的默认行为,因此每次都会获得一个新实例,除非您明确切换到单例。
这就是你绑定到Instance时所做的事情。你正在告诉他们,有人需要一个A的实例,给他这个(通过' new'""。
如果您只想在构建B时注入新的A,请不要在模块中指定任何行为,只需让A有一个使用@Inject注释的构造函数。
答案 1 :(得分:1)
默认绑定在每次注入时都会创建一个新实例。
您不需要声明任何内容:
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"
}
}