Mad Deus disse SpringBoot02: No princípio de funcionamento

Mad Deus disse SpringBoot Series é claro, fácil de entender, baseado na versão SpringBoot2.2.5, bem-vindo rosa atenção louco encaminhado para aprender.

número público micro-canal: Deus louca disse (de partida)   bilibili: Deus louca disse Java (vídeo)  

Sem a permissão do autor é proibida reimpressão

Princípio de funcionamento Inquiry

Antes de escrever HelloSpringBoot, no final é como executá-lo, o projeto Maven, geralmente a partir investiga arquivo pom.xml;

pom.xml

dependência pai

Onde é principalmente dependente de um projeto pai, principalmente de recursos filtros e plug-em projetos de gestão!

< Pai > 
    < groupId > org.springframework.boot </ groupId > 
    < artifactId > Primavera-boot-starter-parent </ artifactId > 
    < versão > 2.2.5.RELEASE </ versão > 
    < relativePath />  <! - pesquisa pai do repositório -> 
</ pai >

Ponto para ele, descobriu que existe um pai dependente

< Pai > 
    < groupId > org.springframework.boot </ groupId > 
    < artifactId > Primavera-boot-dependências </ artifactId > 
    < versão > 2.2.5.RELEASE </ versão > 
    < relativePath > ../../spring- boot-dependências </ relativePath > 
</ pai >

Aqui é a verdadeira gestão SpringBoot todas as aplicações que dependem da versão local, a versão do SpringBoot centro de controle;

Depois de importar dependência há necessidade de escrever a versão padrão, no entanto, se o pacote importado não é gerido de dependência sobre a necessidade de versão configure manualmente;

 

Iniciado primavera-boot-starter

< Dependência > 
    < groupId > org.springframework.boot </ groupId > 
    < artifactId > Primavera-boot-starter-web </ artifactId > 
</ dependência >

-a Bota-Starter-springboot xxx : é cenas springboot arranque

Starter - Bota-Spring web : introduzindo a montagem para nos ajudar módulo web está funcionando normalmente depende;

SpringBoot todas as características cenas são extraídos, fez uma série de arranque (arranque), só têm de introduzir estes arranque no projeto, vai depender de toda a importação correspondente em, usamos o recurso de importação é que tipo de cena de partida pode, nosso futuro também pode personalizar o seu próprio motor de arranque;

classe Master Boot

Análise pom.xml ao longo de olhar para a classe de inicialização

A classe de arranque principal padrão

// @SpringBootApplication para marcar uma classe principal
 // Descrição Esta é uma mola de arranque aplicação 
@SpringBootApplication
 pública  classe SpringbootApplication { 

   pública  estáticos  vazios principais (String [] args) {
      // pensei que era uma maneira de começar, eu não esperava para iniciar um serviço 
      SpringApplication.run (. SpringbootApplication classe , args); 
   } 

}

Mas a classe de inicialização simples não é fácil! Vamos analisar essas anotações ter feito o que

@SpringBootApplication

Papel: Marcação explicação sobre uma classe dessa classe é a configuração de classe principal de SpringBoot, SpringBoot deve executar o método principal desta classe de começar a aplicação SpringBoot;

Digite o seguinte comentário: você pode ver acima, existem muitas outras notas!

@SpringBootConfiguration 
@EnableAutoConfiguration 
@ComponentScan ( 
    excludeFilters = {@filter ( 
    tipo = FilterType.CUSTOM, 
    aulas = {TypeExcludeFilter. Class } 
), @filter ( 
    tipo = FilterType.CUSTOM, 
    aulas = {AutoConfigurationExcludeFilter. Class } 
)} 
) 
público @ Interface SpringBootApplication {
     // ...... 
}

@ComponentScan

Este comentário é muito importante na Primavera, que correspondem a elementos na configuração XML.

Acção: verifica automaticamente e componentes de carga ou de feijão qualificado, definição de feijão serão carregados para dentro do vaso COI

@SpringBootConfiguration

Ação: SpringBoot classe de configuração, uma etiqueta classe diante, indica que esta é uma configuração de classe SpringBoot;

Continuamos a percorrer nesta Ver anotada

// ponto obtido na seguinte @Component 
@Configuration
 pública @ interface de SpringBootConfiguration {} 

@Component 
pública @ a interface de configuração {}

@Configuration aqui, esta é uma configuração descrita, a configuração, e é o ficheiro de configuração xml mola correspondente;

Isso explica por dentro @Component, comece a classe em si também é um componente na Primavera é responsável por iniciar a aplicação!

Continuamos a olhar para trás anotação SpringBootApplication.

@EnableAutoConfiguration

@EnableAutoConfiguration: ativação do recurso de configuração automática

Antes precisamos configurar suas próprias coisas, mas agora SpringBoot pode nos ajudar a automaticamente configure; @EnableAutoConfiguration tell SpringBoot ativação do recurso de configuração automática, a configuração automática para entrar em vigor;

Ver click-through notas seguir:

pacote de configuração automática: @AutoConfigurationPackage

@Import ({secretário. Class })
 público @ interface de AutoConfigurationPackage { 
}

@import : o @import mola anotação fundo, introduzida para um recipiente de montagem

acção Registrar.class: O pacote do programa inicial principal, onde o pacote de todas as seguintes classes e sub-pacotes para verificar todos os componentes dentro do recipiente de mola;

Esta análise é longo, retiro para a etapa anterior, continuar a olhar

@Import ({AutoConfigurationImportSelector.class}): introduzida no recipiente de montagem;

AutoConfigurationImportSelector: seletor de importação de configuração automática, então será selector quais componentes importá-lo? Clique esta classe nós fomos ver o código fonte:

1, esta classe tem um método tal

// obter o candidato configuração 
protegida List <String> getCandidateConfigurations (AnnotationMetadata Metadados, AnnotationAttributes os Atributos) {
     // getSpringFactoriesLoaderFactoryClass onde () método
     // troca é que vemos o início do arquivo de configuração de importação é iniciado classes anotadas automaticamente; EnableAutoConfiguration 
    List < string> Configurações = SpringFactoriesLoader.loadFactoryNames ( a este .getSpringFactoriesLoaderFactoryClass (), o presente .getBeanClassLoader ()); 
    Assert.notEmpty (Configurações, . aulas "nenhuma configuração Auto encontrada no META-INF / spring.factories o usando o Se você é um Embalagens personalizadas, arquivo está correto Claro que a marca ". );
     retorno Configurações; 
}

2, por sua vez, chama a classe método estático SpringFactoriesLoader! Entramos loadFactoryNames classe SpringFactoriesLoader () Método

público  static List <String> loadFactoryNames (<?> Class factoryClass, @Nullable ClassLoader Classloader) { 
    Cadeia factoryClassName = factoryClass.getName ();
    // 这里它又调用了loadSpringFactories方法
    retorno (Lista) loadSpringFactories (carregador de classe) .getOrDefault (factoryClassName, Collections.emptyList ()); 
}

3, continuamos a clique método loadSpringFactories

Privado  estática as Map <String, List <string >> loadSpringFactories (@Nullable ClassLoader Classloader) {
     // obter Classloader, podemos ver um retorno para chegar até aqui é de classe EnableAutoConfiguration marcada si 
    MultiValueMap <String, String> O resultado = (MultiValueMap) Cache .get (carregador de classe);
     IF (! Resultado = nulo ) {
         retornar o resultado; 
    } else {
         try {
             // para adquirir um recurso "META-INF / spring.factories" 
            Enumeration <o URL de> = Classloader urls =! nula carregador de classe?. getResources ( "META-INF / spring.factories "): ClassLoader.getSystemResources ( "META-INF / spring.fábricas"); 
            LinkedMultiValueMap resultado = new new LinkedMultiValueMap (); 

            // o recurso de passagem de leitura, um pacote de tornar as propriedades 
            ao mesmo tempo (urls.hasMoreElements ()) { 
                a URL URL = (URL) urls.nextElement (); 
                um recurso UrlResource = new new um UrlResource (URL); 
                as propriedades Propriedades = PropertiesLoaderUtils.loadProperties (recurso); 
                o Iterator Var6 = properties.entrySet () Iterator ();. 

                o tempo (var6.hasNext ()) { 
                    a entrada entrada = <,?> (a entrada) var6.next ();
                    Cadeia factoryClassName = ((corda) entry.getKey ()) da guarnição ().; 
                    String [] var9 = StringUtils.commaDelimitedListToStringArray ((corda) entry.getValue ());
                    int var10 = var9.length; 

                    para ( int var11 = 0; var11 <var10; ++ var11) { 
                        Cadeia factoryName = var9 [var11]; 
                        result.add (factoryClassName, factoryName.trim ()); 
                    } 
                } 
            } 

            Cache.put (Classloader, resultado); 
            voltar resultado; 
        } captura (IOException var13) {
             lançar  novos IllegalArgumentException ( "Não é possível fábricas de carga do local [META-INF / spring.factories]" , var13); 
        } 
    } 
}

 

4, encontradas várias ocorrências de um arquivo: spring.factories , pesquisa global,

spring.factories

De acordo com nossos spring.factories de código aberto, vimos um monte de arquivos configurados automaticamente, ou seja configurar automaticamente a causa raiz!

WebMvcAutoConfiguration

Nós automaticamente configurada na classe acima apenas para encontrar um olhar aberto, por exemplo: WebMvcAutoConfiguration

Pode-se ver que estes são JavaConfig classe de configuração, e são injetados alguns Bean, você pode encontrar algum tipo de compreensão de sua própria, olhando para se familiarizar!

Por conseguinte, a busca é automaticamente configurada de caminho de classe real todas perfil META-INF / spring.factories, e em que o org.springframework.boot.autoconfigure correspondente. De acordo com o saco item de configuração, no exemplo correspondente marcado por reflexão JavaConfig @Configuration forma de configuração do recipiente classe COI, os quais são depois agregadas e ser carregado em um exemplo de recipiente COI.

conclusão:

  1. SpringBoot EnableAutoConfiguration Obtém o valor especificado pela META-INF / spring.factories caminho de classe na inicialização

  2. Esses valores são automaticamente configurados como uma classe em um navio, a classe terá efeito automaticamente configurado para a configuração automática para o trabalho para nos ajudar;

  3. J2EE inteiras soluções globais e configuração automática são springboot-autoconfigure em um frasco;

  4. Ele lhe dará um monte de contêiner importado classe de configuração automática (xxxAutoConfiguration), este cenário é importar todos os componentes necessários para o recipiente e configurar esses componentes;

  5. Com classe de configuração automática, eliminando a necessidade de escrever manualmente a configuração que injetar componentes funcionais, tais trabalho;

Agora nós provavelmente deve compreender os princípios que operam sob, SpringBoot, vamos aprofundar novamente mais tarde!

SpringApplication

método simples

Inicialmente eu pensei que a execução de um método principal, mas não esperava para abrir um serviço;

@SpringBootApplication
 pública  classe SpringbootApplication {
     pública  estáticos  vazios principais (String [] args) { 
        SpringApplication.run (SpringbootApplication. Classe , args); 
    } 
}

análise SpringApplication.run

O método de análise primária em duas partes, SpringApplication instanciado, o segundo é o método de execução;

SpringApplication

Esta classe é principalmente para fazer as seguintes quatro coisas:

1, inferir o tipo de aplicação é um projecto comum ou projeto Web

2, para encontrar e carregar todos initializer disponíveis, conjunto de atributos para os initializers

3, encontrar tudo o ouvinte aplicações, defina as propriedades para os ouvintes

4, a definição da classe de inferência e o método principal é fornecido, a operação para encontrar a classe principal

Ver construtor:

pública SpringApplication (ResourceLoader ResourceLoader, Classe ... fontes primárias) {
     // ...... 
    este .webApplicationType = WebApplicationType.deduceFromClasspath ();
    esta .setInitializers ( esta .getSpringFactoriesInstances ();
     esta .setListeners ( esta .getSpringFactoriesInstances (ApplicationListener. classe ));
     esta .mainApplicationClass = este .deduceMainApplicationClass (); 
}

Método de análise de fluxo de execução

 Esta foto junto com o código fonte e pode descobrir o!

 

Acho que você gosta

Origin www.cnblogs.com/hellokuangshen/p/12450327.html
Recomendado
Clasificación