@Provides 是否需要使用@Named 参数?

Is @Provides necessary with @Named parameter?

说,我有一个类似下面的模块:

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 中使用,那么我是否需要 @Provides 和 @Singleton 来获取 getB。我不确定 @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() {
        .....
    }
}

这句话读起来可能会有所帮助:

@Provides
@Singleton
@Named("someName")
B getB(SomeArg arg, SomeOtherArg other) {
  //make the thing
}

"This method @Provides a @Singleton which is @Named someName, with type B. Here are the things which are used to make it (method params), and here is how you go about building it (method body)."

@Provides
B getB(@Named("someName") final String someName) {
  //make the thing
}

"This method @Provides an instance of B. In order to create it, a String which is @Named "someName" will be required, and here is how you go about building it (method body)."

请注意,@Named 与任何其他限定符一样,不仅可以在方法上注释,还可以在参数上注释,实际上是说 "does this describe the thing being provided" 或 "does this describe the thing which is required"。它的存在不足以将方法标记为提供者。

注解 @Provides 是创建该绑定类型时应调用的方法所必需的,因此不是可选的。注解 @Singleton 在技术上是可选的,但省略它意味着实例 returns 将不是单例,这可能对您的需求有意义,也可能没有意义。如果不需要,一般的最佳做法是避免将某些内容设为单例。