如果我继续使用实用方法作为静态而不是依赖于弹簧的DI,这是违反吗?
我只需要维护如下的哈希映射:
private static Map<String,JMSMessage> messageMap = Collections.synchronizedMap(new HashMap<String,JMSMessage>());
messageMap可以被多个线程访问。我有实用的方法来玩mapMap。我将我的类作为final,并将所有实用程序方法声明为static。根据春季IoC,它是否违规?
答案 0 :(得分:4)
我认为,尽管它可能并且在Spring IOC中正常工作,但它违反了控制反转的原则。
最好使用由IOC管理的单例bean而不是使用静态字段,比如
@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方法更好的原因有很多:
顺便说一句,我建议您不要使用Collections.synchronizedMap。您是否考虑过使用ConcurrentHashMap?
答案 1 :(得分:0)
不,它不违反spring,因为变量是static
。 Static
个变量只能通过类名访问。当您希望从实现中删除依赖时,Spring IoC非常有用,以便以后可以更改它而不会影响其他任何内容。对于static
个变量和方法,您别无选择,只能通过类名访问它们。
请记住静态变量和方法不能覆盖。