在Spring中实例化Util类

时间:2014-09-24 16:49:38

标签: java spring spring-mvc

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

Util Class

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类?

2 个答案:

答案 0 :(得分:2)

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

这是因为你不想让阴影搞乱你的方法,因为如果你需要一个构造函数,那么它不是一个实用程序类。

回到你的例子:

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

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

你具体说他们可以通过让他们成为非决赛来改变。因此,假设您的方法正在使用它们,更改它们的值,然后另一个线程进入并在该方法运行时创建对象的另一个实例。因此 - 重置静态字段。你的方法在没有任何明显原因且没有你能够重现它的情况下突然突然断裂。

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

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

警告:

我不确定你给出的代码,但在我看来,使用静态单例util类在这里是一个坏主意。大多数应用程序都希望不时地更改密钥,而静态类中的非平凡逻辑很难进行测试。有更好的方法可以做到这一点,其中最直接的方法是 - 让你的CipherUtil成为一个真正的bean。

答案 1 :(得分:0)

默认情况下,Java类是包私有的。

请参阅:http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

让你的utils类公开最终。

public final class CipherUtil { ... }

此外,如果要初始化任何静态类变量,则需要使用静态初始化程序。

public final class CipherUtil {

  private static final String SECRET_KEY;

  // Can't be instantiated 
  private CipherUtil(){ }

  static{
    //Initialize stuff here
    SECRET_KEY = "sEcrEtkEy";
  }

}