对不起,如果这是一个微不足道的问题,我是新的指南。假设我有下面这个类:
public class MyClass {
@Inject
public MyClass(final MyDependency myDependency) {
this.name = myDependency.getName();
}
public String getName() {
this.name;
}
}
然后在其他地方我想做:
public class SomeOtherClass {
public void test() {
MyClass instanceFoo = injector.getInstance(MyClass.class);
MyClass instanceBar = injector.getInstance(MyClass.class);
assertTrue("foo", instanceFoo.getName());
assertTrue("bar", instanceBar.getName());
}
}
我希望有两个“MyClass”实例,一个名为“foo ”,一个名为“bar ”(也就是说,它们中的每一个都有一个不同的依赖实例)。我如何将这两个实例添加到我的注入器中,如何用“injector.getInstance”检索它们中的每一个?
我不想为每个可能的依赖项创建一个“MyClass”的子类。
谢谢你!
您的问题,如标题所示,有一个更简单的解决方案:如果你想要任意数量的MyClass或MyDependency实例,你可以注入一个提供程序
与问题的主体一样,有两个部分:为同一个<code>类</code>创建多个可注入的<code>键</code>,以及使用不同的名称和注入的依赖项按照您想要的方式设置实例。
Guice使用< code>Key
标识绑定,它是一个完全限定的类(如< code>MyClass或< code>List
大多数情况下,您可以不直接使用Key:在< code>bind调用中使用< code>annotatedWith,或者将注释添加到< code>@Provides方法中,并通过将注释放在构造函数参数或@ Inject-annoted字段中来请求它们。但是,您仍然可以通过使用Key上的静态方法手动创建一个键来使用< code>getInstance和< code>getProvider。(对于复杂的情况,使用TypeLiteral或< code > names . named ;详情见他们的文档。)
现在您知道了如何注入@命名("foo")Myclass
或@Foo Myclass
,您如何提供它们?根据您的需要,我会选择三个选项之一:绑定toInance
、使用@提供
方法或创建“辅助注入”工厂。
>
如果您的MyClass实例本身不需要注入,并且您不需要改变或操纵实例状态,您可以根据需要准备命名的实例,然后用toInstance
将它们绑定到。
您还可以编写一个
@Provides @Named(“foo”)
MyClass 方法,该方法采用 MyClass
参数(Guice 通过注入器提供),设置名称并返回实例。这是编写提供程序类或实例的低开销替代方法,将为您提供一个新实例,而不是 toInstance
绑定所暗示的共享。
如果您真的希望< code>name
成为您的类的构造函数参数的一部分,也许是为了保持实例不变,您可以使用“辅助注入”来告诉Guice哪些参数是您自己提供的,哪些参数来自Guice注入器。这将允许您注入一个< code>MyClass。Factory,并调用< code > myclassfactory . create(" foo "),这可以直接在您的消费类中完成,或者使用上面的< code>@Provides技术。细节稍微超出了问题的范围,但是请查阅“辅助注入”以获得关于语法和添加适当JAR的细节。
我们已经使用Google Guice框架进行依赖注入。我需要在Java创建一个接口的多个insatnce。 执行从这里开始:下面代码中的KFHRecordValidator.java类: process类具有RecordValidationHelper类的引用,并且注入是通过构造函数进行的。iRecordValidationService.java是一个具有validate方法的接口。 类处理器有
问题内容: 您能否获得2个具有相同基础类型的单例实例? 在春季,这显然是微不足道的,因为它基于您将范围附加到其上的命名实例,但是我看不到关于将类型绑定到实现类的指南。请注意,由于有问题的实例通过guice注入了其他依赖项,因此我不想绑定到该实例。 问题答案: Guice也很容易!创建两个招标注解,说和,然后 然后
我有一个名为“消费者”的界面。 实现如下所示: } 我需要有2个consumerImpl类的实例,但要注入不同的DBManager实现。如何通过guice配置?
我有一组验证器类,它们都扩展了一个公共抽象类,它们都具有相同的构造函数 我想要Guice的能力 < li >知道如何构造所有这些验证器,将相同的数据源注入所有这些验证器中 < li >使用多绑定器将所有验证器注入到一个类中 通过一些谷歌搜索,看起来我可以使用,但问题是如果我想这样做,我必须为每个验证器创建一个工厂,这是一个巨大的样板。因为他们都有相同的构造函数,我觉得一定有更好的方法。我的对象是在
问题内容: 我有一个自动相互连接的Spring bean图。大大简化了图示: 所有这些bean都没有指定范围,这暗示它们是单例(使它们成为显式单例不会改变任何东西,我已经尝试过)。 问题在于,在实例化 单个应用程序上下文之后 ,的实例和包含的 不同 实例。怎么会这样 我试图为它创建public no args构造函数,并且调试已确认创建了多次。所有这些创建的堆栈跟踪都在这里。 我还尝试过为Spri
我有一张相互自动连线的Spring豆图。高度简化的插图: 所有这些bean都没有指定作用域,这意味着它们是单例(我已经尝试过了,让它们显式单例不会改变任何东西)。 问题是,在实例化单个应用程序上下文之后,Bar和Baz的实例包含不同的Foo实例。这怎么会发生? 我尝试为创建公共no args构造函数,并且调试已确认已多次创建。所有这些创建的堆栈跟踪都在这里。 我还尝试为Spring启用调试日志记录