在 Guice 中重新配置(或重置)单例服务

问题描述 投票:0回答:1

我有一个遗留代码,我决定使用 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
时进行比较。

还有其他方法可以实现这一目标吗?

java dependency-injection guice
1个回答
0
投票

我不确定为什么

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(...);
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.