[英]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.