Spring 3应用中的静态实用工具类

时间:2012-03-08 12:52:04

标签: java spring dependency-injection

如果我继续使用实用方法作为静态而不是依赖于弹簧的DI,这是违反吗?

我只需要维护如下的哈希映射:

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

messageMap可以被多个线程访问。我有实用的方法来玩mapMap。我将我的类作为final,并将所有实用程序方法声明为static。根据春季IoC,它是否违规?

2 个答案:

答案 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方法更好的原因有很多:

  1. 您将来可能需要多个实例。
  2. 您可以在单元测试中模拟MessageManager接口。
  3. (与2相关)如果使用静态字段,则无法确定测试期间messageMap的状态。如果您开始并行运行测试(Maven中的标准选项),这会变得更加复杂。
  4. 顺便说一句,我建议您不要使用Collections.synchronizedMap。您是否考虑过使用ConcurrentHashMap?

答案 1 :(得分:0)

不,它不违反spring,因为变量是staticStatic个变量只能通过类名访问。当您希望实现中删除依赖时,Spring IoC非常有用,以便以后可以更改它而不会影响其他任何内容。对于static个变量和方法,您别无选择,只能通过类名访问它们

请记住静态变量和方法不能覆盖。