Spring: Statik alana bir değer nasıl enjekte edilir?


91

Bu sınıfla

@Component
public class Sample {

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


}

Denersem Sample.name, her zaman 'boş' olur. Ben de bunu denedim.

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

}

Bu kod çalışır. Sample.namedüzgün ayarlanmış. Bu iyi bir yol mu değil mi? Değilse, daha iyi bir yol var mı? Ve nasıl yapılır?


1
Bu çözülmez; statik değişken nesne oluşturmadan önce kullanılırsa. Örn.) Statik değişken, kaynağı oluşturmak için statik blok altında kullanılırsa, o zaman kaynak null ile oluşturulur.
Kanagavelu Sugumar

Yanıtlar:


117

Her şeyden önce, public staticolmayan finalalanlardır kötülük . Bahar, bir nedenle bu tür alanlara enjeksiyon yapılmasına izin vermez.

Kişisel geçici çözüm , hatta alıcı / ayarlayıcı gerekmez geçerlidir privatealan yeterlidir. Öte yandan şunu deneyin:

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

( @Autowired/ ile çalışır @Resource). Ancak size yapıcı bir tavsiye vermek gerekirse: privateTarla yerine alan ve alıcı ile ikinci bir sınıf oluşturun public static.


9
"Umumi statik nihai olmayan alanlar kötüdür" için, bana biraz referans verebilir misiniz?
Anderson

7
Nihai olmayan, statik bir alan için iş parçacığı eşzamanlılığını, diğer bir deyişle yığındaki ağrı işlemeyi ifade eden alan değerini değiştirebileceğiniz anlamına gelir.
Xavier Portebois

@Value Statik blok ile nasıl kullanılır? Lütfen bize rehberlik edin ... Saygılarımızla, Neha

4
Bilginize: Yukarıdaki kod bir Sonar / Kontrol Tarzı ihlaline neden olur (bu tür bir şeyden rahatsızsanız), çünkü statik bir alana yazılan bir örnek yönteminiz vardır.
Neil

Son yönü, yalnızca o anda boş ise değeri ayarlayan statik bir ayarlayıcı kullanarak taklit etmek mümkündür. Yani alanın yalnızca bir değişikliğine izin verirsiniz. (tabii ki özel yapılmıştır ve ona erişmek için bir alıcı kullanır). Spring, yapılandırma aşamasında (XML veya Ek Açıklama) statik yöntemi çağırabilir.
Walfrat

0

Bu, statik yük değişkeni için örnek kodum

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 ek açıklamasını bulduğunda belirli değeri doldurmak için bağımlılık enjeksiyonu kullanır. Ancak, değeri örnek değişkenine vermek yerine, bunun yerine örtük ayarlayıcıya verilir. Bu ayarlayıcı daha sonra NAME_STATIC değerimizin popülasyonunu işler.

    @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;
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.