首页 > 解决方案 > @Provides 是否需要 @Named 参数?

问题描述

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

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() {
        .....
    }
}

标签: guice

解决方案


像句子一样阅读它可能会有所帮助:

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

“这个方法@Providesa @Singletonwhich is @Named someName, with type B。这是用来制作它的东西(方法参数),这是你如何构建它(方法体)。”

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

“这个方法@Provides是一个实例B。为了创建它,需要一个String,这@Named "someName"就是你如何构建它(方法体)。”

请注意@Named,与任何其他限定符一样,它不仅可以在方法上进行注释,还可以在参数上进行注释,实际上是说“这是否描述了所提供的事物”或“这是否描述了所需的事物”。它的存在不足以将方法标记为提供者。

@Provides应调用以创建该绑定类型的方法需要注释,因此不是可选的。注释@Singleton在技术上是可选的,但省略它意味着实例返回不会是单例,这可能对您的需求有意义,也可能没有意义。如果不需要,一般的最佳实践是避免将某些东西设为单例。


推荐阅读