Z tą klasą
@Component
public class Sample {
@Value("${my.name}")
public static String name;
}
Jeśli spróbuję Sample.name
, zawsze jest to „zerowe”. Więc spróbowałem tego.
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;
}
}
Ten kod działa. Sample.name
jest prawidłowo ustawiony. Czy to dobry sposób, czy nie? Jeśli nie, czy jest coś lepszego? A jak to zrobić?
spring
code-injection
Whiteship
źródło
źródło
Odpowiedzi:
Przede wszystkim
public static
nie-final
pola są złe . Wiosna z jakiegoś powodu nie pozwala na wtryskiwanie na takie pola.Twoje obejście jest prawidłowe, nie potrzebujesz nawet metody pobierającej / ustawiającej,
private
wystarczy pole. Z drugiej strony spróbuj tego:@Value("${my.name}") public void setPrivateName(String privateName) { Sample.name = privateName; }
(działa z
@Autowired
/@Resource
). Ale żeby dać ci konstruktywną radę: stwórz drugą klasę zprivate
field i getter zamiastpublic static
field.źródło
To jest mój przykładowy kod do ładowania zmiennej statycznej
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; } }
źródło
Spring używa iniekcji zależności, aby wypełnić określoną wartość, gdy znajdzie adnotację @Value. Jednak zamiast przekazywać wartość do zmiennej instancji, jest ona zamiast tego przekazywana do niejawnej metody ustawiającej. Ten ustawiający obsługuje następnie populację naszej wartości 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; } }
źródło