gpt4 book ai didi

java - Guice @annotations 方法类似于 Guice MapBinder 方法

转载 作者:行者123 更新时间:2023-11-29 06:52:36 26 4
gpt4 key购买 nike

我是 Guice DI 的新手。我想弄清楚我的情况。

简单来说,有没有通过Guice @annotations来替代MapBinder的?

我的场景:

Interface A{}
Class A1 implements A{}
Class A2 implements A{}

我想注入(inject)A的实现类如下,

if(param = One) then Inject A1 to A
if(param = Two) then Inject A2 to A

我知道上面可以用MapBinder来完成,但我想通过注释来完成,如下所示,

Class A1 implements A
{
@Inject(param = One)
A1(){}
}

Class A2 implements A
{
@Inject(param = Two)
A2(){}
}

所以用参数注解的类可以根据参数(一或二)自动选择和注入(inject)类。

既然@Inject 不能接受参数,覆盖@Inject 在这种情况下会有帮助吗?如果是这样,我们该怎么做?

或者这种情况是否只能通过使用 MapBinder 进行绑定(bind)来实现(我不想使用 binder 的原因是我们想要显式定义键值对的绑定(bind)映射,但是使用注释只是简单地注释带有参数的实现类 - 更容易维护)。

提前致谢。

最佳答案

为了回答您的后续问题,我相信您正在寻找的是命名注入(inject)。看这个例子:

public class GuiceNamedTest extends AbstractModule {

public static void main(String[] args) {
Injector i = Guice.createInjector(new GuiceNamedTest());
i.getInstance(InstaceOne.class);
i.getInstance(InstaceTwo.class);
}

@Override
protected void configure() {
Bean beanOne = new Bean();
beanOne.name = "beanOne";

Bean beanTwo = new Bean();
beanTwo.name = "beanTwo";

bind(Bean.class).annotatedWith(Names.named("one")).toInstance(beanOne);
bind(Bean.class).annotatedWith(Names.named("two")).toInstance(beanTwo);

bind(InstaceOne.class);
bind(InstaceTwo.class);
}


public static class Bean {
String name;
}

public static interface A {}

public static class InstaceOne implements A {

@javax.inject.Inject
public InstaceOne(@Named("one") Bean b1) {
System.out.println(b1.name);
}
}

public static class InstaceTwo implements A {

@javax.inject.Inject
public InstaceTwo(@Named("two") Bean b1) {
System.out.println(b1.name);
}
}

}

在这里,我使用 annotatedWith 来命名我的 guice 处理实例。其中一个对应于字符串“一”,另一个对应于“二”,类似于您的示例。

然后,在我的 A 实现中,我可以使用 @Named 注释对这些 bean 进行特定注入(inject)。

运行上面代码的结果是:

beanOne
beanTwo

如您所见,它将我的 bean 的正确实例注入(inject)到正确的实现中。

希望对你有帮助,

阿图尔

关于java - Guice @annotations 方法类似于 Guice MapBinder 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42755725/

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