在 Spring 中实例化 Util 类

αƞj*_*jiβ 1 java spring spring-mvc

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) { ... }
}
Run Code Online (Sandbox Code Playgroud)

服务等级

Class MyService {
  @Autowired OtherService otherService;

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

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

Ord*_*ous 5

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

这是因为您不希望阴影干扰您的方法,并且因为如果您需要一个构造函数,那么它就不是一个实用程序类。

回到你的例子:

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

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

你特别说他们可以通过使它们成为非最终的来改变。因此,假设您的方法正在对它们执行某些操作,更改它们的值,然后另一个线程进入并在该方法运行时创建对象的另一个实例。因此 - 重置静态字段。您的方法在没有任何明显原因的情况下突然崩溃,并且您无法重现它。

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

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

一句警告:

我不确定您提供的代码,但在我看来,在这里使用静态单例 util 类是个坏主意。大多数应用程序会时不时地更改密钥,而静态类中的非平凡逻辑很难测试。有更好的方法可以做到这一点,其中最直接的方法是制作CipherUtil一个真正的 bean。