2010-11-22 20 views
1

Hey、 Springの静的な初期化をどのように扱うべきですか?つまり、私のbeanは静的初期化を持っています。春の静的初期化Springの静的初期化

private static final Map<String, String> exceptionMapping = ErrorExceptionMapping.getExceptionMapping(); 

そして私はErrorExceptionMappingが前にロードされていることに気をつける必要があります。私はこの試みた:

<bean id="errorExceptionMapping" class="cz.instance.transl.util.ErrorExceptionMapping" /> 
<bean id="validateService" class="cz.instance.transl.services.ValidateService" depends-on="errorExceptionMapping" > 

をしかし、私は、静的な初期化を省略するか、Beanのメソッド、そのコースの罰金内からメソッドを呼び出す場合、私は

java.lang.NoClassDefFoundError: Could not initialize class cz.instance.transl.util.ErrorExceptionMapping 

を得ました。初期化コールバック(affterPropertiesSet())はここでは役に立たないと思います。

答えて

4

staticを他のBeanに依存させることは、Springの方法ではありません。

staticのままにしておきたい場合は、遅く初期化することができます。この場合、depends-onは適切な初期化順序を適用できます。

EDIT:遅延ロードすることにより私はこのような何かを意味する(私はここにホルダークラスイディオムで遅延初期化を使用し、他の遅延初期化イディオムを代わりに使用することができます):

private static class ExceptionMappingHolder { 
    private static final Map<String, String> exceptionMapping = 
     ErrorExceptionMapping.getExceptionMapping(); 
} 

ExceptionMappingHolder.exceptionMappingの代わりexceptionMappingを使用。

+0

貼り付けられたコードを見てみましたが、クラスのNoClassDefFoundErrorを返します。このクラスには、私が宣言しなければならないたくさんのクラスがあります。 – lisak

+0

@lisak:更新されました。 – axtavt

3

クラスを@Component注釈でマークし、静的変数を設定するための非静的セッターに@Autowired(required=true)注釈を追加することができます。

Here's a link詳細については、

+1

私はそれがうまくいくと思いますが、私はHashMapを初期化しているので、複雑です。私はいくつかのリファクタリングを行い、それを春のやり方でやっていますが、とにかくシングルトンです。 – lisak