Для краткости: использовать статический метод в порядке.
Когда мы говорим, что статические методы должны быть методом утилиты, мы говорим о том, что статический метод должен быть потокобезопасным.
Давайте посмотрим на метод SecurityContextHelper.getContext(). Он реализуется следующим образом:
private static SecurityContextHolderStrategy strategy;
public static SecurityContext getContext() {
return strategy.getContext();
}
Обратите внимание, что она возвращает контекст из статической переменной strategy
. Таким образом, strategy
должен поддерживать потоки.
SecurityContextHolderStrategy
интерфейс имеет три реализации:
два из них являются нити местных, другой имеет private static SecurityContext contextHolder;
Тогда давайте посмотрим SecurityContextHolder.initialize() метод:
private static void initialize() {
if ((strategyName == null) || "".equals(strategyName)) {
// Set default
strategyName = MODE_THREADLOCAL;
}
if (strategyName.equals(MODE_THREADLOCAL)) {
strategy = new ThreadLocalSecurityContextHolderStrategy();
} else if (strategyName.equals(MODE_INHERITABLETHREADLOCAL)) {
strategy = new InheritableThreadLocalSecurityContextHolderStrategy();
} else if (strategyName.equals(MODE_GLOBAL)) {
strategy = new GlobalSecurityContextHolderStrategy();
} else {
// Try to load a custom strategy
try {
Class<?> clazz = Class.forName(strategyName);
Constructor<?> customStrategy = clazz.getConstructor();
strategy = (SecurityContextHolderStrategy) customStrategy.newInstance();
} catch (Exception ex) {
ReflectionUtils.handleReflectionException(ex);
}
}
initializeCount++;
}
Это показывает, что MODE_THREADLOCAL является стратегией по умолчанию. И даже GlobalSecurityContextHolderStrategy также использует статический контекст. Поэтому вы можете использовать их в статическом методе.
так что конкретно? – nafas
Ваш вопрос в том, должен ли он быть статичным? – Bono
Я сделал метод статическим, правильно ли это или я должен сделать его нестатичным – Programmer