2015-02-26 6 views
0

У меня есть метод, который извлекает данные пользователя loggedin из объекта springsecuritycontext.нестационарные статические методы

Я читал, что только методы утилиты (которые выполняют определенные вычисления) должны быть статическими.

Вот мой метод, это не представляется метод полезности, но я не находим никаких причин, почему я не должен сделать его статическим, как я использую его в несколько фасоли

public static int getSignedUpUser() 
    { 
     final SecurityContext ctx = SecurityContextHolder.getContext(); 

     if(ctx != null) 
     { 
      final Authentication auth = ctx.getAuthentication(); 

      if(auth != null) 
      { 
       final Object principal = auth.getPrincipal(); 


       if(principal instanceof AUser) 
       { 
        final AUser au = (AUser)principal; 
        return au.getId(); 
       } 
      } 
     } 

     return 0; 
    } 
} 
+0

так что конкретно? – nafas

+0

Ваш вопрос в том, должен ли он быть статичным? – Bono

+0

Я сделал метод статическим, правильно ли это или я должен сделать его нестатичным – Programmer

ответ

0

Для краткости: использовать статический метод в порядке.

Когда мы говорим, что статические методы должны быть методом утилиты, мы говорим о том, что статический метод должен быть потокобезопасным.

Давайте посмотрим на метод SecurityContextHelper.getContext(). Он реализуется следующим образом:

private static SecurityContextHolderStrategy strategy; 

public static SecurityContext getContext() { 
    return strategy.getContext(); 
} 

Обратите внимание, что она возвращает контекст из статической переменной strategy. Таким образом, strategy должен поддерживать потоки.

SecurityContextHolderStrategy интерфейс имеет три реализации:

enter image description here

два из них являются нити местных, другой имеет 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 также использует статический контекст. Поэтому вы можете использовать их в статическом методе.

0

концептуально показанный метод impl является частью экземпляра класса. поэтому манипуляции могут быть статическими. поэтому я предпочитаю использовать устаревший, а не статический метод.

0

Вы не зададите правильный вопрос. Если вы посмотрите на метод getSignedUpUser, вы увидите класс, в котором он входит. Ваш вопрос должен быть следующим:

Кто получил зарегистрированного пользователя? Экземпляр или все экземпляры коллективно (класс)?

static Члены или методы являются коллективными членами или методами. Например, количество птиц - это коллективные данные о птицах, это static. Нестатические члены или методы являются индивидуальными. Например, у птицы есть вес, который связан с птицей индивидуально.