αƞ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 类?
Checkstyle 对 Util 类有一个很好的规则,它指出:
实用程序类不应该有任何非私有构造函数并且应该是 final。
这是因为您不希望阴影干扰您的方法,并且因为如果您需要一个构造函数,那么它就不是一个实用程序类。
回到你的例子:
让构造函数初始化静态字段是BAD。
为什么?因为它们是可变的。
你特别说他们可以通过使它们成为非最终的来改变。因此,假设您的方法正在对它们执行某些操作,更改它们的值,然后另一个线程进入并在该方法运行时创建对象的另一个实例。因此 - 重置静态字段。您的方法在没有任何明显原因的情况下突然崩溃,并且您无法重现它。
一个更好的方法是使字段成为最终的。如果它们是不可变的,那么就没有危险。但是你如何初始化它们呢?您不能使用构造函数(编译器错误)。可以提供帮助的是静态初始值设定项。它们在类加载时运行一次,并且可以完全访问静态字段。您可能希望使用一个块来设置您的值。
如果字段是可变的,那么将它们设为静态并在构造函数中初始化是最糟糕的事情。重新考虑您的设计。否则,您将在线程问题中打开一个全新的蠕虫罐。
一句警告:
我不确定您提供的代码,但在我看来,在这里使用静态单例 util 类是个坏主意。大多数应用程序会时不时地更改密钥,而静态类中的非平凡逻辑很难测试。有更好的方法可以做到这一点,其中最直接的方法是制作CipherUtil一个真正的 bean。
| 归档时间: |
|
| 查看次数: |
4903 次 |
| 最近记录: |