2011-08-31 17 views
36
このクラスでは

Spring:静的フィールドに値を挿入する方法は?

@Component 
public class Sample { 

     @Value("${my.name}") 
    public static String name; 


} 

私はSample.nameをしようとすると、それは常に 'NULL' です。だから私はこれを試した。

public class Sample { 

    public static String name; 

    @PostConstruct 
    public void init(){ 
     name = privateName; 
    } 

    @Value("${my.name}") 
    private String privateName; 

    public String getPrivateName() { 
     return privateName; 
    } 

    public void setPrivateName(String privateName) { 
     this.privateName = privateName; 
    } 

} 

このコードは機能します。 Sample.nameが正しく設定されています。これは良い方法ですか?そうではありませんか?そうでない場合、もっと良い方法がありますか?そしてそれをどうやってやるの?

+0

これは解決しません。オブジェクトの作成前に静的変数が使用されている場合例えば、スタティックブロックの下でスタティック変数を使用してリソースを構築する場合、リソースはヌルで構築されます。 –

答えて

55

全部、public staticfinalフィールドは、悪いです。 Springは、理由のために、そのようなフィールドへの注入を許可しません。

回避策が有効で、getter/setterも必要ない場合は、privateフィールドで十分です。

@Value("${my.name}") 
public void setPrivateName(String privateName) { 
    Sample.name = privateName; 
} 

@Autowired/@Resourceで動作します):一方、これを試してみてください。しかし、いくつか建設的な助言を与える:public staticフィールドの代わりにprivateフィールドとゲッターで2番目のクラスを作成します。

+4

「public static final final fieldsは悪い」のため、参考文献を教えてください。 – Anderson

+3

最終的には、フィールド値を変更することができます。これは、静的フィールドの場合、スタック内のスレッド同時実行性 - a.k.a.痛みを処理することを意味します。 –

+0

スタティックブロックで@Valueを使用するには?親切に私たちを導く...よろしく、Neha –

関連する問題