用于Spring DI的Java Static最终替代方案

时间:2012-03-01 16:27:04

标签: java spring dependency-injection

我有一个课我想要static final个变量。

public static final Map<String, Long> ID_MAP; 

我希望能够通过Spring注入地图。这不能用b / c它是static final。我的替代方法是将其声明为static并将Spring与setter一起使用。像

这样的东西
public void setIDMapSpring (long iDMapSpring){
   ID_MAP = iDMapSpring; 

然而,这意味着另一个类可以改变该值。有什么替代方案我可以尝试。我正在考虑将一个Singleton与Map作为final字段,但我仍然想弄清楚如何将Map以及可能需要标记为final的其他变量传递给{{1 }} 方法。而且,我很难找到最简单,最简单的解决方案。

2 个答案:

答案 0 :(得分:3)

将地图设为一个字段并注入一个单例。

答案 1 :(得分:0)

如果你担心在Spring设置它之后更改值的外部类,你可以在你的类中集成一个标志,只允许字段设置一次。假设您将名为“CAN_SET_ID_MAP”的静态AtomicBoolean初始化为true。然后,在地图的设置器中:

if (CAN_SET_ID_MAP.compareAndSet (true, false)) {
  ID_MAP = iDMapSpring;
} else {
  throw new IllegalStateException ("ID_MAP already set");
}

还有其他方法可以做到这一点。无论如何,您可能希望使用线程安全的保护形式。