gpt4 book ai didi

java - 我可以使用 Guice 在方法中获取实例吗?

转载 作者:行者123 更新时间:2023-11-29 07:55:38 24 4
gpt4 key购买 nike

我刚开始使用 Guice,所以我的理解可能完全错误。

我有一个接口(interface) Foo 和一个实现 FooImp

我在我的模块中使用了以下代码来注入(inject)它:

bind(Foo.class).annotatedWith("Foo").toInstance(foo);  // foo is an instance of FooImp

然后我想现在在我的代码中,凡是带有名称注释“Foo”的 Foo 实例将被替换为 foo

@Named("Foo")
Foo fooInst; // fooInst will be foo at runtime?

如果我是对的,我该如何实现:

public Foo doSomething() {  // for some reason there must be no arguments
@Named("Foo")
Foo fooInst; // injecting here seems not allowed...?
fooInst.do();
}

最佳答案

您的假设并不完全正确:Guice 用于依赖注入(inject),这意味着您可以将一些接口(interface)/类注入(inject)到另一个类的构造函数中。

假设您有一个接口(interface) Foo 及其实现 FooImpl。然后你还有一个 Bar 类,它依赖于 Foo 的实现。

public class Bar {

private Foo foo;

@Inject
public Bar(@Named("foo") Foo foo) {
this.foo = foo;
}

//some other methods
}

在您的 Guice 模块中,您必须编写

bind(Foo.class).annotatedWith(Names.named("Foo")).toInstance(foo);
//let's say this is part of the module MyModule extends AbstractModule

设置完成后,您可以使用 Guice 的 Injector 类创建一个对象的主方法。像这样:

Injector injector = Guice.createInjector(new MyModule());
Bar bar = injector.getInstance(Bar.class);
//do something with bar

希望这对您有所帮助。如果您有更多问题,请随时问我!

提示:查看Guice的网站, 观看那边的视频并仔细阅读 wiki。 Guice 是一个非常棒的工具,但您需要在使用它之前进行一些研究。祝你好运!


补充:在我看来,使用@Named 是一种糟糕的代码风格。您可以更好地定义自己的注释。例如:

@BindingAnnotation
@Target({ FIELD, PARAMETER, METHOD })
@Retention(RUNTIME)
public @interface FooAnnotation {
}

然后将 Bar 类中的 @Named("foo") 替换为 @FooAnnotation 并替换 Names.named("Foo") 通过 FooAnnotation.class 在您的模块中。

关于java - 我可以使用 Guice 在方法中获取实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17954946/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com