我有一个遗留代码,我决定使用 Google Guice 进行重构。
在我的项目中,我有一个名为
AccessVerifier
的服务,如下所示:
@Singleton
public class AccessVerifier {
private JWTVerifier verifier;
public AccessVerifier(String secret) {
this.verifier = JWT.require(Algorithm.HMAC256(secret)).build();
}
public void setSecret(String secret){
this.verifier = JWT.require(Algorithm.HMAC256(secret)).build();
}
public DecodedJWT decodeToken(String token)
{
DecodedJWT jwt = this.verifier.verify(token);
// Verify some claims from the obtained token
return jwt;
}
}
我们会不时地轮换该
secret
参数。我希望能够“重新配置”或重置服务,以便它重新初始化该 verifier
成员。
没有 Guice,我们有一个经典的单例实现(通过
getInstance()
),所以我会做类似的事情:
AccessVerifier.getInstance().setSecret(...);
但是自从迁移到 Guice 后,这就不再可能了,因为我自然希望 Guice 来管理我的服务实例。
我可以做类似的事情:
App.getInjector().get(AccessVerifier.class).setSecret(...)
但这,哇,感觉非常脏:(
我的另一个想法是将
Provider<String>
传递给 AccessVerifier
,但我不想每次都创建 JWTVerifier
。我需要存储“以前的”秘密并在每次我想使用verifier
时进行比较。
还有其他方法可以实现这一目标吗?
我不确定为什么
App.getInjector().get(AccessVerifier.class).setSecret(...);
看起来比
更脏AccessVerifier.getInstance().setSecret(...);
这些都是从某处查找实例并告诉它修改秘密。
如果它是 Guice 单例,你可以在需要的地方 @Inject 并直接调用它:
class SecretResetter {
private final AccessVerifier accessVerifier;
@Inject
SecretResetter(AccessVerifier accessVerifier) {
this.accessVerifier = accessVerifier;
}
void resetSecret() {
accessVerifier.setSecret(...);
}
}