Spring: Bagaimana cara memasukkan nilai ke bidang statis?

90

Dengan kelas ini

@Component
public class Sample {

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


}

Jika saya coba Sample.name, selalu 'null'. Jadi saya mencoba ini.

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;
    }  

}

Kode ini berfungsi. Sample.namesudah diatur dengan benar. Apakah ini cara yang baik atau tidak? Jika tidak, apakah ada cara yang lebih baik? Dan bagaimana melakukannya?

Whiteship
sumber
Ini tidak akan menyelesaikan; jika variabel statis digunakan sebelum pembuatan objek. misalnya) jika variabel statis digunakan di bawah blok statis untuk membangun sumber daya, maka sumber daya akan dibangun dengan null.
Kanagavelu Sugumar

Jawaban:

115

Pertama-tama, public staticnon- finalbidang itu jahat . Musim semi tidak memungkinkan penyuntikan ke bidang seperti itu karena suatu alasan.

Solusi Anda valid, Anda bahkan tidak perlu pengambil / penyetel, privatebidang sudah cukup. Di sisi lain, coba ini:

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

(bekerja dengan @Autowired/ @Resource). Tetapi untuk memberi Anda beberapa saran konstruktif: Buat kelas kedua dengan privatelapangan dan pengambil alih-alih public staticlapangan.

Tomasz Nurkiewicz
sumber
9
Untuk "bidang non-final statis publik adalah jahat", dapatkah Anda memberi saya beberapa referensi?
Anderson
7
Cara non-final Anda dapat mengubah nilai kolom, yang, untuk kolom statis, menyiratkan penanganan konkurensi thread - alias nyeri di tumpukan.
Xavier Portebois
Bagaimana cara menggunakan @Value dengan blok Statis? Mohon
4
FYI: Kode di atas akan menyebabkan pelanggaran Sonar / Checkstyle (jika Anda peduli tentang hal semacam itu) karena Anda memiliki metode instance yang menulis ke bidang statis.
Neil
Dimungkinkan untuk meniru aspek terakhir dengan menggunakan penyetel statis yang hanya akan menyetel nilai jika saat ini null. Jadi, Anda hanya mengizinkan satu modifikasi bidang. (yang tentu saja telah dijadikan pribadi dan menggunakan getter untuk mengaksesnya). Spring dapat memanggil metode statis dalam fase konfigurasinya (XML atau Annotation).
Walfrat
0

Ini adalah kode contoh saya untuk memuat variabel statis

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;
    }
}
Thành Nguyễn
sumber
-2

Spring menggunakan injeksi ketergantungan untuk mengisi nilai tertentu ketika menemukan anotasi @Value. Namun, alih-alih menyerahkan nilai ke variabel instance, itu diserahkan ke penyetel implisit sebagai gantinya. Penyetel ini kemudian menangani populasi nilai NAME_STATIC kami.

    @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;
    }
}
Vitalii Shramko
sumber