说,我有一个类似下面的模块:
public class TestModule extends AbstractModule {
@Override
protected void configure() {
}
@Provides
@Singleton
public A getA(final B b) {
A a = new A(b, getC());
return a;
}
@Provides
@Singleton
private B getB(@Named("someName") final String someName) {
......
}
private C getC() {
.....
}
}
这里的问题是,如果B仅在TestModule中使用,那么getB是否需要@Provides和@Singleton。我不确定将@Named用作参数,方法上是否需要@Provides。
因为我不需要它,那么我可以简单地删除getB上的所有注释,它将如下所示:
public class TestModule extends AbstractModule {
@Override
protected void configure() {
}
@Provides
@Singleton
public A getA() {
A a = new A(getB(), getC());
return a;
}
private B getB(@Named("someName") final String someName) {
......
}
private C getC() {
.....
}
}
答案 0 :(得分:1)
像句子这样阅读可能会有所帮助:
@Provides
@Singleton
@Named("someName")
B getB(SomeArg arg, SomeOtherArg other) {
//make the thing
}
“此方法@Provides
是@Singleton
@Named
,类型为someName
的{{1}}。以下是用于制作该方法的方法(方法参数),那么您将如何构建它(方法主体)。”
B
“此方法@Provides
B getB(@Named("someName") final String someName) {
//make the thing
}
是@Provides
的实例。为了创建它,需要B
String
的{{1}},在这里是如何构建它(方法主体)的方法。”
请注意,@Named
像任何其他限定符一样,不仅可以在方法上注释,而且可以在参数上注释,实际上是说“这是描述要提供的东西”还是“是要描述要提供的东西”是必须的”。它的存在不足以将方法标记为提供者。
对于创建该绑定类型应调用的方法,注释"someName"
是必需的,因此不是可选的。注释@Named
在技术上是可选的,但是省略它意味着实例返回将不是单例,这可能对您的需求没有意义。如果不需要,通常的最佳做法是避免使某物成为单例。