वसंत: स्थैतिक क्षेत्र के लिए एक मूल्य कैसे इंजेक्ट करें?


91

इस वर्ग के साथ

@Component
public class Sample {

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


}

अगर मैं कोशिश करता हूं Sample.name, तो यह हमेशा 'अशक्त' होता है। इसलिए मैंने यह कोशिश की।

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ठीक से सेट है। यह अच्छा तरीका है या नहीं? यदि नहीं, तो क्या कुछ और अच्छा तरीका है? और यह कैसे करना है?


1
यह हल नहीं होगा; यदि स्थिर चर का उपयोग ऑब्जेक्ट निर्माण से पहले किया जाता है। उदाहरण) यदि संसाधन के निर्माण के लिए स्थैतिक ब्लॉक के तहत स्थैतिक चर का उपयोग किया जाता है, तो संसाधन का निर्माण अशक्त के साथ किया जाएगा।
काणागावेलु सुगुमार

जवाबों:


116

सबसे पहले, public staticगैर- finalक्षेत्र बुराई हैं । वसंत ऐसे क्षेत्रों में एक कारण के लिए इंजेक्शन लगाने की अनुमति नहीं देता है।

आपका वर्कअराउंड मान्य है, आपको गेटटर / सेटर की भी आवश्यकता नहीं है, privateफ़ील्ड पर्याप्त है। दूसरी ओर यह कोशिश करें:

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

( @Autowired/ के साथ काम करता है @Resource)। लेकिन आपको कुछ रचनात्मक सलाह देने के लिए: privateफ़ील्ड के बजाय फ़ील्ड और गेट्टर के साथ एक दूसरी कक्षा बनाएं public static


9
"सार्वजनिक स्थैतिक गैर-अंतिम क्षेत्र बुराई हैं", क्या आप मुझे कुछ संदर्भ दे सकते हैं?
एंडरसन

7
गैर-अंतिम का मतलब है कि आप फ़ील्ड मान को संशोधित कर सकते हैं, जो एक स्थिर फ़ील्ड के लिए, थ्रेड कंसीलर को हैंडल करने का अर्थ है - स्टैक में उर्फ ​​दर्द।
ज़ेवियर पोर्टेबिस

स्थैतिक ब्लॉक के साथ @Value का उपयोग कैसे करें? कृपया हमें मार्गदर्शन करें ... सादर, नेहा

4
बस FYI करें: उपरोक्त कोड सोनार / चेकस्टाइल उल्लंघन का कारण होगा (यदि आप उस तरह के बारे में परेशान हैं) जैसा कि आपके पास एक स्थिर क्षेत्र में लिखने की विधि है।
नील

एक स्थिर सेटर का उपयोग करके अंतिम पहलू की नकल करना संभव है जो केवल मूल्य निर्धारित करेगा यदि यह वर्तमान में शून्य है। तो आप क्षेत्र के केवल एक संशोधन की अनुमति देते हैं। (जो निश्चित रूप से निजी बना दिया गया है और इसे एक्सेस करने के लिए एक गेट्टर का उपयोग करें)। वसंत अपने कॉन्फ़िगरेशन चरण (एक्सएमएल या एनोटेशन) में स्थैतिक विधि को कॉल कर सकता है।
वॉलफ्रैट

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

जब यह @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;
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.