Spring中是否有任何注释可实例化util类。我有服务层使用的util类。

实用类

Class CipherUtil {
  private static final String  SECRET_KEY = "sEcrEtkEy";
  private static Cipher cipher;
  private static SecretKeySpec secretKeySpec;

  public CipherUtil() {
    //initilize cipher and secretKeySpec properties
  }

  public static String encrypt(String plainText) { ... }

  public static String decrypt(String encryptedText) { ... }
}


服务等级

Class MyService {
  @Autowired OtherService otherService;

  public void doSomething() {
      //CipherUtil is null
      String decryptedMsg = CipherUtil.encrypt("Hello World!!!");
  }
}


如何在使用方法之前告诉Spring创建CipherUtil类?

最佳答案

Checkstyle对于Util类有一个很好的规则,该规则指出:
实用程序类不应具有任何非私有构造函数,并且应该是最终的。

这是因为您不想让阴影弄乱您的方法,并且因为如果您需要构造函数,那么它不是实用程序类。

回到您的示例:

让构造函数初始化静态字段是BAD。

为什么?因为它们是易变的。

您明确地说,可以通过使它们不定值来更改它们。因此,假设您的方法正在对它们进行操作,更改其值,然后另一个线程进入并在该方法运行时创建对象的另一个实例。因此-重置静态字段。您的方法突然中断,没有任何明显的原因,也无法复制它。

更好的方法是将字段定为最终字段。如果它们是不变的,那么就没有危险。但是如何初始化它们?您不能使用构造函数(编译器错误)。 static initializers是可以帮助的。它们在类加载后运行一次,并且可以完全访问静态字段。您可能需要使用一个块来设置值。

如果字段是可变的,那么使它们成为静态对象并在构造函数中初始化是您最糟糕的事情。重新考虑您的设计。否则,您将在线程问题方面打开一堆全新的蠕虫。

警告:

我不确定您提供的代码,但在我看来,在这里使用static-singleton util类不是一个好主意。大多数应用都会不时更改键,并且静态类中的非平凡逻辑很难进行测试。有更好的方法可以做到这一点,其中最直接的方法是-将您的CipherUtil设置为实际的bean。

07-25 22:41