Spring: จะฉีดค่าลงในช่องคงที่ได้อย่างไร?


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
สิ่งนี้จะไม่สามารถแก้ไขได้ หากใช้ตัวแปรคงที่ก่อนการสร้างวัตถุ เช่น) ถ้าตัวแปรคงที่ถูกใช้ภายใต้บล็อกแบบคงที่เพื่อสร้างทรัพยากรทรัพยากรนั้นจะถูกสร้างด้วย null
Kanagavelu Sugumar

คำตอบ:


116

ครั้งแรกของทั้งหมดpublic staticที่ไม่ใช่finalสาขาที่เป็นความชั่วร้าย สปริงไม่อนุญาตให้ฉีดเข้าไปในช่องดังกล่าวด้วยเหตุผล

วิธีแก้ปัญหาของคุณถูกต้องคุณไม่จำเป็นต้องใช้ getter / setter privateฟิลด์ก็เพียงพอแล้ว ในทางกลับกันลองทำดังนี้:

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

(ทำงานร่วมกับ@Autowired/ @Resource) แต่เพื่อให้คำแนะนำที่สร้างสรรค์แก่คุณ: สร้างคลาสที่สองพร้อมprivateฟิลด์และรับแทนpublic staticฟิลด์


9
สำหรับ "ช่องที่ไม่สิ้นสุดแบบคงที่สาธารณะเป็นสิ่งชั่วร้าย" โปรดให้ข้อมูลอ้างอิงแก่ฉันได้ไหม
Anderson

7
ไม่ใช่ขั้นสุดท้ายหมายความว่าคุณสามารถแก้ไขค่าฟิลด์ซึ่งสำหรับฟิลด์แบบคงที่หมายถึงการจัดการเธรดพร้อมกัน - หรือที่เรียกว่าความเจ็บปวดในสแต็ก
Xavier Portebois

จะใช้ @Value กับ Static block ได้อย่างไร? กรุณาแนะนำเรา ... ขอแสดงความนับถือ Neha

4
เพียงแค่ FYI: โค้ดด้านบนจะทำให้เกิดการละเมิด Sonar / Checkstyle (หากคุณกังวลเกี่ยวกับสิ่งนั้น) เนื่องจากคุณมีวิธีการอินสแตนซ์ที่เขียนลงในฟิลด์แบบคงที่
Neil

เป็นไปได้ที่จะเลียนแบบลักษณะสุดท้ายโดยใช้ตัวตั้งค่าคงที่ซึ่งจะกำหนดค่าก็ต่อเมื่อปัจจุบันเป็นโมฆะ ดังนั้นคุณจึงอนุญาตให้แก้ไขฟิลด์ได้เพียงครั้งเดียว (ซึ่งแน่นอนว่าถูกทำให้เป็นส่วนตัวและใช้ getter เพื่อเข้าถึง) Spring สามารถเรียกวิธีการคงที่ในเฟสการกำหนดค่าของเขา (XML หรือ Annotation)
Walfrat

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

Spring ใช้การฉีดพึ่งพาเพื่อเติมค่าเฉพาะเมื่อพบคำอธิบายประกอบ @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;
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.