Com esta aula
@Component
public class Sample {
@Value("${my.name}")
public static String name;
}
Se eu tentar Sample.name
, é sempre 'nulo'. Então eu tentei isso.
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;
}
}
Este código funciona. Sample.name
está definido corretamente. Este é um bom caminho ou não? Se não, existe algo mais bom? E como fazer isso?
spring
code-injection
Whiteship
fonte
fonte
Respostas:
Em primeiro lugar, os
public static
não-final
campos são maus . O Spring não permite a injeção em tais campos por uma razão.Sua solução alternativa é válida, você nem precisa de getter / setter, o
private
campo é o suficiente. Por outro lado, tente o seguinte:@Value("${my.name}") public void setPrivateName(String privateName) { Sample.name = privateName; }
(funciona com
@Autowired
/@Resource
). Mas, para lhe dar alguns conselhos construtivos: Crie uma segunda classe comprivate
campo e getter em vez depublic static
campo.fonte
Este é o meu código de amostra para carregar variável estática
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; } }
fonte
Spring usa injeção de dependência para preencher o valor específico quando encontra a anotação @Value. No entanto, em vez de passar o valor para a variável de instância, ele é passado para o configurador implícito. Este setter então lida com a população de nosso valor 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; } }
fonte