Prefácio
Para configurar de maneira flexível em projetos, geralmente usamos arquivos de configuração. Arquivos de configuração comuns são como XML e Propriedades. O Springboot permite o uso de propriedades e arquivos YAML como configurações externas. O suporte do compilador para o idioma YAML não é bom o suficiente agora e o arquivo de propriedades ainda é usado como uma configuração externa.
Antes do lançamento da Spring Cloud Config, implementei o Centro de Configuração baseado em ZK e eliminei o arquivo de configuração de propriedades locais. O princípio é muito simples, mas acabei de sobrecarreguei mergeProperties() do PropertyPlaceHoldConfigurer:
/*** Sobrecarregar a implementação da propriedade Mesclar* Primeiro Carregar as propriedades do arquivo e depois se fundir nas propriedades lidas pelo ZK Configuration Center** @return Mesced Property Collection* @THOWSEXCECTIONCECECTION*/ @OverlideProtected Properties MergeProperties () lança ioexception {Propriedades Result = New Propriedades (); // Carregar a configuração das propriedades da classe pai MergeProperties = super.MergeProperties (); resultado.putall (MergeProperties); // carrega a configuração lida no mapa zk <string, string> configs = loadzkconfigs (); resultado.putall (configs); resultado de retorno;} Essa implementação é muito fácil de usar em projetos de primavera, mas recentemente alguns projetos de botas de primavera descobriram que a implementação deste espaço reservado e @ConfigurationProperties(prefix = "xxx") não podem funcionar bem.
Ou seja, as propriedades não são resolvidas e você pode lê -las da maneira @value, mas se houver muitas propriedades para @value, ainda é bastante pesado. Eu ainda costumo usar o prefixo do @ConfigurationProperties. Então eu olhei para a documentação da inicialização da primavera e descobri que o PropertySource
ordem:
* Devtools Global Setting Properties no seu diretório inicial (~/.spring-boot-devtools.properties quando o Devtools está ativo).
* @TestPropertySource Anotações em seus testes.
* @SpringBootTest#Propriedades Atributo de anotação em seus testes.
* Argumentos da linha de comando.
* Propriedades de spring_application_json (JSON embutido em linha incorporado em uma variável de ambiente ou propriedade do sistema)
* Parâmetros de init de servletconfig.
* Parâmetros INIT para servletContext.
* Atributos JNDI de Java: Comp/Env.
* Propriedades do sistema Java (System.getProperties ()).
* Variáveis de ambiente do sistema operacional.
* Um RandomValuePropertySource que possui apenas propriedades aleatoriamente.*.
* Propriedades do aplicativo específicas do perfil fora do seu frasco embalado (APLICAÇÃO- {perfil} .Properties and Yaml Variants)
* Propriedades do aplicativo específicas do perfil embaladas dentro do seu frasco (APLICAÇÃO- {perfil} .Properties e variantes de YAML)
* Propriedades do aplicativo fora do seu frasco embalado (Application.Properties e Variantes YAML).
* Propriedades do aplicativo embaladas dentro do seu frasco (Application.Properties e Variantes YAML).
* @PropertySource Anotações nas suas classes @Configuration.
* Propriedades padrão (especificadas usando SpringApplication.SetDefaultProperties).
Não é difícil descobrir que ele pode verificar as propriedades nas propriedades do sistema Java. Ou seja, basta escrever as propriedades lidas por MergeProperties nos adereços do sistema Java, observar o código -fonte e encontrar um ponto de entrada.
/*** Sobrecarregar a implementação da propriedade da propriedade* De acordo com as opções, decida se escrever os adereços mesclados nas propriedades do sistema. A inicialização da mola requer * * @param beanfactoryToprocess * @param Props Propriedades mescladas * @Throws beansexception */ @ @SubsterideProtected Void ProcessProperties (ConfigurableListableBeanFactory BeanFactoryToprocess, Propriedades Props) lança Benesex. // grava na propriedade do sistema if (writePropstosystem) {// Escreva todas as propriedades para o sistema para enumeração de inicialização da mola <?> PropertyNames = props.PropertyNames (); while (PropertyNames.HasMoreElements ()) {String PropertyName = (String) PropertyNames.NextElement (); String PropertyValue = Props.getProperty (PropertyName); System.SetProperty (PropertyName, PropertyValue); }}} Para evitar impacto excessivo, um comutador está definido para escrever propriedades do sistema. Se for um projeto de inicialização da primavera, ligue-o, para minimizar o impacto nos projetos de inicialização on-line que não são da primavera. Em seguida, @ConfigurationProperties da Spring Boot leem perfeitamente as propriedades;
Consulte o código específico: org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor
@OverridePublic Object PostprocessBeforeinitialization (Object Bean, String Beanname) lança Beansexception {ConfigurationProperties anotação = AnoTationUtils .Findannotation (bean.getclass (), configurationproperties.class); if (anotação! = null) {pós -processoBeforeinitialization (Bean, Beanname, anotação); } anotação = this.BeanS.FindFactoryAnnotation (Beanname, ConfigurationProperties.class); if (anotação! = null) {pós -processoBeforeinitialization (Bean, Beanname, anotação); } retornar Bean;}Resumir
O acima é o conteúdo inteiro deste artigo. Espero que o conteúdo deste artigo tenha certo valor de referência para o estudo ou trabalho de todos. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar. Obrigado pelo seu apoio ao wulin.com.