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


90

このクラスで

@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正しく設定されています。これは良い方法ですか?そうでない場合、もっと良い方法はありますか?そしてそれを行う方法は?


これは解決しません。オブジェクトの作成前に静的変数が使用されている場合。例)静的変数が静的ブロックの下でリソースを構築するために使用される場合、リソースはnullで構築されます。
Kanagavelu Sugumar 2016年

回答:


115

まず第一に、public staticfinalフィールドはです。Springは、理由により、そのようなフィールドへの注入を許可していません。

あなたの回避策は有効です、あなたはゲッター/セッターさえ必要としません、privateフィールドは十分です。一方、これを試してください:

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

@Autowired/で動作します@Resource)。ただし、建設的なアドバイスを提供するprivateには、public staticfieldの代わりにfieldとgetterを使用して2番目のクラスを作成します。


9
「パブリックスタティック非ファイナルフィールドは悪」について、参考にさせてください。
アンダーソン

7
非最終とは、フィールド値を変更できることを意味します。これは、静的フィールドの場合、スレッドの並行性の処理を意味します。これは、スタックの痛みとも呼ばれます。
Xavier Portebois 2015

静的ブロックで@Valueを使用する方法は?親切に私たちを導く...よろしく、ネハ

4
参考までに:静的フィールドに書き込むインスタンスメソッドがあるため、上記のコードはSonar / Checkstyle違反を引き起こします(そのようなことを気にしている場合)。
ニール

現在nullの場合にのみ値を設定する静的セッターを使用して、最終的な側面を模倣することができます。したがって、フィールドの変更は1つだけ許可します。(もちろんプライベートにされており、ゲッターを使用してアクセスします)。Springは、構成フェーズ(XMLまたはアノテーション)で静的メソッドを呼び出すことができます。
Walfrat 2016年

0

これは静的変数をロードするための私のサンプルコードです

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class OnelinkConfig {
    public static int MODULE_CODE;
    public static int DEFAULT_PAGE;
    public static int DEFAULT_SIZE;

    @Autowired
    public void loadOnelinkConfig(@Value("${onelink.config.exception.module.code}") int code,
            @Value("${onelink.config.default.page}") int page, @Value("${onelink.config.default.size}") int size) {
        MODULE_CODE = code;
        DEFAULT_PAGE = page;
        DEFAULT_SIZE = size;
    }
}

-2

Springは、@ Valueアノテーションを見つけると、依存性注入を使用して特定の値を設定します。ただし、値をインスタンス変数に渡す代わりに、暗黙のセッターに渡します。次に、このセッターはNAME_STATIC値の母集団を処理します。

    @RestController 
//or if you want to declare some specific use of the properties file then use
//@Configuration
//@PropertySource({"classpath:application-${youeEnvironment}.properties"})
public class PropertyController {

    @Value("${name}")//not necessary
    private String name;//not necessary

    private static String NAME_STATIC;

    @Value("${name}")
    public void setNameStatic(String name){
        PropertyController.NAME_STATIC = name;
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.