编辑
我不知道MessageDigest 是一次性使用类。您展示了该类的注入,根据定义,该类不能提供多个实例。所以这个问题是有缺陷的。
您必须通过绑定创建 MD 而不是 MD 本身的工厂函数来解决此问题。例如。供应商:
final MessageDigestModule extends AbstractModule {
@Provide
Supplier<MessageDigest> provideMd5Digest() {
return () -> MessageDigest.getInstance("MD5");
}
}
然后在创建注入器时,安装new MessageDigestModule()。
您将使用@Inject Supplier<MessageDigest> md5DigestSupplier;。在你需要的地方,你会说md5DigestSupplier.get()。
如果您需要不止一种MessageDigest,那么您应该声明注释并使用它们来分隔绑定。
@BindingAnnotation @Target({ FIELD, PARAMETER, METHOD }) @Retention(RUNTIME)
@interface Md5 {}
@BindingAnnotation @Target({ FIELD, PARAMETER, METHOD }) @Retention(RUNTIME)
@interface Sha256 {}
接着
final MessageDigestModule extends AbstractModule {
@Provide
@Md5
Supplier<MessageDigest> provideMd5Digest() {
return () -> MessageDigest.getInstance("MD5");
}
@Provide
@Sha256
Supplier<MessageDigest> provideMd5Digest() {
return () -> MessageDigest.getInstance("SHA-256");
}
}
最后:
@Inject
@Sha256
Supplier<MessageDigest> sha128DigestSupplier;