Static Utility Class в приложении Spring 3 - PullRequest
1 голос
/ 08 марта 2012

Является ли это нарушением, если я продолжу использовать вспомогательные методы как статические, а не в зависимости от DI пружины?

Мне просто нужно поддерживать хэш-карту, как показано ниже:

private static Map<String,JMSMessage> messageMap = Collections.synchronizedMap(new HashMap<String,JMSMessage>());

messageMapмогут быть доступны для нескольких потоков.У меня есть полезные методы, чтобы поиграть в messageMap.Я сделал свой класс финальным и объявил все служебные методы статическими.Это нарушение по весне IoC?

Ответы [ 2 ]

4 голосов
/ 08 марта 2012

Я бы сказал, что, хотя это возможно и будет работать правильно в Spring IOC, это является нарушением принципов инверсии управления.

Было бы лучше использовать одноэлементный компоненткоторый управляется вашим IOC, а не использует статическое поле, например

  @Component
  @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
  public class SimpleMessageManager implements MessageManager {
      private Map messageMap = Collections.synchronizedMap(new HashMap());  

      @Override
      void addMessage(...) { ... }

      @Override
      void getMessage(...) { ... }

  }

. Затем вы можете добавить свой MessageManager следующим образом:

  public class SomeBean {
      @Resource
      MessageManager messageManager;
  }

Существует множество причин, по которым вы должны придерживаться IOC.подход лучше:

  1. В будущем вам может потребоваться более одного экземпляра.
  2. В модульных тестах можно смоделировать интерфейс MessageManager.
  3. (относится к 2) Если вы используете статические поля, вы не можете быть уверены в состоянии messageMap во время тестирования.Это становится еще более сложным, если вы начнете запускать свои тесты параллельно (стандартная опция в Maven)

Кроме того, я бы порекомендовал вам не использовать Collections.synchronizedMap.Рассматривали ли вы вместо этого использование ConcurrentHashMap?

0 голосов
/ 08 марта 2012

Нет, это не нарушение пружины, потому что переменная static.Static переменные доступны только через имя класса.Spring IoC полезен, когда вы хотите удалить зависимость из реализации , чтобы впоследствии она могла измениться, не затрагивая ничего другого.В случае static переменных и методов у вас нет выбора, кроме как получить к ним доступ через их имя класса .

И помните, что статические переменные и методы не могут быть переопределены .

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