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。