guice - @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() {
.....
}
}
解决方案
像句子一样阅读它可能会有所帮助:
@Provides
@Singleton
@Named("someName")
B getB(SomeArg arg, SomeOtherArg other) {
//make the thing
}
“这个方法@Provides
a @Singleton
which 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
在技术上是可选的,但省略它意味着实例返回不会是单例,这可能对您的需求有意义,也可能没有意义。如果不需要,一般的最佳实践是避免将某些东西设为单例。
推荐阅读
- flutter - Flutter:在 PDF 上显示图像网格
- mongodb - 如何在 microk8s 集群上部署 Mongodb 副本集
- java - 为什么提取此 ZIP 存档失败?
- php - Elasticbeanstalk 使用 .ebextensions 修改 php-fpm
- c# - 使用目标类的反射读取二进制文件
- python - Python:如何在保存了原始索引的列表的所有元素之间获得差异
- php - 当我尝试在购物车中添加产品时,将显示错误。产品将添加到购物车中,但购物车未显示。试图获取非对象的属性“图像”
- python - AWS - Codebuild 失败的问题
- linux - CMake 项目未通过 Visual Studio 2022 在 WSL2 上加载
- python - 以编程方式设置气流中的连接/变量