Я бы сказал, что, хотя это возможно и будет работать правильно в 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.подход лучше:
- В будущем вам может потребоваться более одного экземпляра.
- В модульных тестах можно смоделировать интерфейс MessageManager.
- (относится к 2) Если вы используете статические поля, вы не можете быть уверены в состоянии messageMap во время тестирования.Это становится еще более сложным, если вы начнете запускать свои тесты параллельно (стандартная опция в Maven)
Кроме того, я бы порекомендовал вам не использовать Collections.synchronizedMap.Рассматривали ли вы вместо этого использование ConcurrentHashMap?