Весна: Як ввести значення в статичне поле?


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поля є злом . Весна не дозволяє впорскувати в такі поля з причини.

Ваше обхідне рішення дійсне, вам навіть не потрібен getter / setter, privateполя достатньо. З іншого боку, спробуйте це:

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

(працює з @Autowired/ @Resource). Але щоб дати вам конструктивну пораду: створіть другий клас із privateполем та геттером замість public staticполя.


9
Щодо "загальнодоступні статичні нефінальні поля - це зло", не могли б ви дати мені посилання?
Андерсон,

7
Не остаточне означає, що ви можете змінити значення поля, що для статичного поля передбачає обробку паралельного потоку - він же біль у стеку.
Ксав'єр Портебуа

Як використовувати @Value зі статичним блоком? Будь ласка,

4
Просто FYI: Наведений вище код спричинить порушення Sonar / Checkstyle (якщо вас турбують подібні речі), оскільки у вас є метод екземпляра, який записується в статичне поле.
Ніл

Можна імітувати кінцевий аспект, використовуючи статичний сеттер, який буде встановлювати значення лише в тому випадку, якщо воно на даний момент має значення null. Отже, ви дозволяєте лише одну модифікацію поля. (що, звичайно, було зроблено приватним і використовуйте геттер для доступу). Spring може викликати статичний метод у своїй фазі конфігурації (XML або анотація).
Вальфрат,

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;
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.