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.name
sudah diatur dengan benar. Apakah ini cara yang baik atau tidak? Jika tidak, apakah ada cara yang lebih baik? Dan bagaimana melakukannya?
spring
code-injection
Whiteship
sumber
sumber
Jawaban:
Pertama-tama,
public static
non-final
bidang itu jahat . Musim semi tidak memungkinkan penyuntikan ke bidang seperti itu karena suatu alasan.Solusi Anda valid, Anda bahkan tidak perlu pengambil / penyetel,
private
bidang 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 denganprivate
lapangan dan pengambil alih-alihpublic static
lapangan.sumber
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; } }
sumber
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; } }
sumber