বসন্ত: স্থির ক্ষেত্রের মান কীভাবে ইনজেক্ট করবেন?


90

এই ক্লাসের সাথে

@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সঠিকভাবে সেট করা হয়। এই ভাল উপায় না? তা না হলে আরও কিছু ভাল উপায় আছে কি? এবং কিভাবে এটা করতে হবে?


এটি সমাধান করবে না; স্থির পরিবর্তনশীল যদি বস্তু তৈরির আগে ব্যবহার করা হয়। উদাহরণস্বরূপ) যদি স্ট্যাটিক ভেরিয়েবলটি স্টাটিক ব্লকের অধীনে সংস্থানটি তৈরি করতে ব্যবহৃত হয়, তবে উত্সটি নাল দিয়ে নির্মিত হবে।
কানাগাভেলু সুগুমার

উত্তর:


115

প্রথমত, public staticঅ- finalক্ষেত্রগুলি মন্দ । বসন্ত কোনও কারণে এই জাতীয় ক্ষেত্রগুলিতে ইনজেকশন দেয় না।

আপনার কাজের ভিত্তি বৈধ, আপনার এমনকি গেটর / সেটারও দরকার নেই, privateক্ষেত্র যথেষ্ট। অন্যদিকে এটি চেষ্টা করুন:

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

(সাথে কাজে @Autowired/ @Resource)। তবে আপনাকে কিছু গঠনমূলক পরামর্শ দেওয়ার জন্য: privateফিল্ডের পরিবর্তে ফিল্ড এবং গেটর দিয়ে একটি দ্বিতীয় শ্রেণি তৈরি করুন public static


9
"পাবলিক স্ট্যাটিক অ চূড়ান্ত ক্ষেত্রগুলি খারাপ" এর জন্য, আপনি কি আমাকে কিছু উল্লেখ করতে পারেন?
অ্যান্ডারসন

7
চূড়ান্ত নয় মানে আপনি ক্ষেত্রের মানটি সংশোধন করতে পারবেন যা স্থির ক্ষেত্রের জন্য থ্রেড সামঞ্জস্যের হ্যান্ডলিং বোঝায় - স্তরে ব্যথা aka
জাভিয়ের পোর্টেবোইস

স্ট্যাটিক ব্লক সহ @ ভ্যালু কীভাবে ব্যবহার করবেন? দয়া করে আমাদের গাইড করুন ... শুভেচ্ছা, নেহা

4
কেবলমাত্র এফওয়াইআই: উপরের কোডটি সোনার / চেকস্টাইল লঙ্ঘনের কারণ ঘটবে (যদি আপনি সেই ধরণের বিষয়ে উদ্বিগ্ন হন) কারণ আপনার কাছে একটি স্ট্যাটিক ক্ষেত্রে কোনও লেখার পদ্ধতি রয়েছে।
নীল

স্থির সেটার ব্যবহার করে চূড়ান্ত দিকটির নকল করা সম্ভব যা বর্তমানে মানটি নির্ধারণ করলেই এটি সেট করবে। সুতরাং আপনি কেবলমাত্র ক্ষেত্রটি পরিবর্তনের অনুমতি দিন। (অবশ্যই কোনটি ব্যক্তিগত করা হয়েছে এবং এটি অ্যাক্সেসের জন্য একটি গিটার ব্যবহার করুন)। বসন্ত তার কনফিগারেশন পর্যায়ে স্থির পদ্ধতিতে কল করতে পারে (এক্সএমএল বা টিকা)।
ওয়ালফ্র্যাট

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

@ ভ্যালু টীকাটি খুঁজে পেলে বসন্তটি নির্দিষ্ট মানকে পপুলেট করতে নির্ভরতা ইনজেকশন ব্যবহার করে। যাইহোক, উদাহরণটি ভেরিয়েবলটিতে মান হস্তান্তর না করে পরিবর্তে এটি অন্তর্ভুক্ত সেটার হাতে দেওয়া হবে। এই সেটারটি তখন আমাদের 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.