@Name是否需要@Named参数?

时间:2019-01-30 02:54:12

标签: guice

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

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

1 个答案:

答案 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在技术上是可选的,但是省略它意味着实例返回将不是单例,这可能对您的需求没有意义。如果不需要,通常的最佳做法是避免使某物成为单例。