С этим классом
@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
установлен правильно. Это хороший способ или нет? Если нет, есть ли более хороший способ? И как это сделать?
spring
code-injection
Whiteship
источник
источник
Ответы:
Во-первых,
public static
неполяfinal
- зло . Spring по какой-то причине не позволяет делать инъекции в такие поля.Ваш обходной путь действителен, вам даже не нужен геттер / сеттер,
private
достаточно поля. С другой стороны, попробуйте следующее:@Value("${my.name}") public void setPrivateName(String privateName) { Sample.name = privateName; }
(работает с
@Autowired
/@Resource
). Но чтобы дать вам конструктивный совет: создайте второй класс сprivate
полем и получателем вместоpublic static
поля.источник
Это мой пример кода для загрузки статической переменной
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; } }
источник
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; } }
источник