簡體   English   中英

使用 Guice 創建 MessageDigest

[英]Create MessageDigest with Guice

我正在嘗試找到一種使用 Guice 初始化 MessageDigest 的方法。 目前我有這個:

public class MyClass {

    MessageDigest md;
    
    public MyClass() {
        try {
            md = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }
....
}

我想看看它是否可以寫成:

@Inject
MessageDigest md;

但是如何讓 Guice 調用MessageDigest.getInstance("MD5")呢?

編輯

我不知道MessageDigest是單次使用 class。您顯示了 class 的注入,根據定義不能提供多個實例。 所以這個問題是有缺陷的。

您必須通過綁定一個創建 MD 而不是 MD 本身的工廠 function 來解決這個問題。 例如供應商:

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;

MessageDigest是一個非常特殊的 class。它的所有實例都是一次性的。 因此必須非常小心地注射。

首先,您必須告訴 Guice 創建 class 的多個實例。這是在您的Module class 中完成的,如下所示。

@Provides
MessageDigest provideMD5() throws NoSuchAlgorithmException {
  return MessageDigest.getInstance("MD5");
}

然后,一旦您擁有可以每次創建實例的提供程序,它就會被注入,您實際上可能不希望每個注入實例只需要一個實例。 因此,您可能必須執行以下操作:

@Inject
Provider<MessageDigest> md5Provider;

...

// Later in the class
MessageDigest md5 = md5Provider.get();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM