1. Por que posso obter uma configuração automática usando a anotação de @springbootapplication?
Resposta: @springbootApplication, na verdade existem 3 anotações internas. @Enableautoconfiguration, @componentscan, @configuration. Este artigo explica principalmente a anotação @enablexx
2. Por que @enableautoconfiguration é usado? Quando o @ConfigurationProperties é usado, os itens de configuração no .yML ou .Properties podem ser importados automaticamente?
Resposta: Inside @enableautoconfiguration, a anotação @import é usada. Importar o AutoConfigurationImportSelector ajuda a carregar o SpringBoot a configuração qualificada no contêiner do IOC. Mas o uso interno do SpringFacoriesLoader é usado para concluí -lo. Semelhante ao Java SPI, ou seja, carregando a configuração de /meta-inf/spring.factories
@Target ({elementType.type})@retention (retentionPolicy.Runtime)@documentado@herdado@autoConfigurationPackage@import ({autoconfigurationImportSelector.class}) public @Interface EnableAutoconfigurationVocê pode ver que, em @Import, uma classe AutoconfigurationImportSelector é realmente importada. O mais importante é que esta classe implementa o IMPORTSELECTOR DE INTERFACE
Public Interface ImportSelector { /** * Selecione e retorne os nomes de quais classes (s) devem ser importadas com base na * {@link anoTationMetadata} da classe importing@{@link Configuration}. */ String [] SelectImports (AnnotationMetadata importingClassMetadata);}Esta é a descrição do ImportSelector, que significa aproximadamente que o feijão retornado por esse método será injetado e gerenciado automaticamente pela primavera.
Em seguida, vejamos a implementação do SelectImports no AutoConfigurationImportSelector
public String [] SelectImports (anoTationMetadata anoTationMetadata) {if (! this.isEnabled (anoTationMetadata)) {return No_imports; } else {AutoConfigurationMetadata AutoConfigurationMetadata = AutoConfigurationMetadatalOader.loadMetadata (this.BeanclassLoader); AnoTationAttributes Attributes = this.getAttributes (AnoTationMetadata); List <String> Configurações = this.getCandidateConFigurações (anotaçãoMetadata, atributos); configurações = this.RemovedUplicates (configurações); Set <tring> exclusões = this.GetexClusions (AnoTationMetadata, atributos); this.checkexcludedclasses (configurações, exclus); configurações.removeall (exclusões); configurações = this.Filter (configurações, auto -figurationMetadata); this.fireautoconfigurationImportEvents (configurações, exclusões); return stringutils.toStringArray (configurações); }}O código é escrito com muita clareza. Eu não vou explicar.
Em @Import, você pode ver que um link aponta para o IMPORTBEANDEFINIITEREGRARRAR. Esta também é uma interface, e sua função é a mesma que o ImportSelector.
interface pública ImportbeanDefinitionRegistrar {public void RegisterBeandEfinitions (AnnotationMetadata ImportingClassMetadata, BeaNDefinitionRegistry);}No método RegisterBeanDefinitions, você pode usar o BendEfinitionRegistry para injetar o feijão que queremos injetar.
Exemplo de código:
Escreva seu próprio @enable usando @import
1. Crie 2 feijão de teste
função da classe pública {} public class Usuário {}2. Personalizar anotações de ativação
@Target ({elementType.type})@retention (retentionpolicy.runtime)@documentado@import (myenableautoconfig.class) public @interface EnableBean {}3. Implemente sua própria classe de ativação de ativação
public class MyenableAutoconfig implementa o importação {@Override public String [] SelectImports (AnoTationMetadata ImportingClassMetadata) {return new String [] {"com.xhn2.role", "com.xhn2.User"}; }}4. Escreva uma aula de inicialização
@EnableBean@componentsCan ("com.xhn2") public class Main {public static void main (string [] args) {configurableApplicationContext context = springapplication.run (main.class, args); System.out.println (context.getBean (user.class)); System.out.println (context.getBean (função.class)); }}5. Resultados da operação
com.xhn2.user@496bc455
com.xhn2.role@59402b8f
O console imprime com sucesso.
Código Exemplo 2, montagem automática do pacote JAR de terceiros
Novo projeto Maven
1. Pom.xml
<ModelVersion> 4.0.0 </modelversion> <puperid> org.csp </groupiD> <TRATIFACTID> Hello </ArtifactId> <Versão> 1.0.0 </siers> <sperties> <maven.compiler.source> 1.8 </Maven.comPiler.source> <Maven.comPiler..comer..comgen.comgen.comGerce> 1.8 <//Maven.comPiler.source> <Maven.comPiler.ChPiler...C.Al.Al.................S, 1 en8erciler.Sorce> 1.8 </Maven.comPiler.source> <Maven.com.comer..compiler. <Project.build.sourceEncoding> utf-8 </project.build.sourceEncoding> </sperties> <pendências> <pendesency> <puperid> org.springframework </groupid> <stifactId> spring-context </stifactid> </siPendenci> </grupo>
2. Escreva a configuração
@ConfigurationPublic Classe mytest {@Bean public runnable runnable () {return ()-> {}; }}Crie um novo arquivo meta-inf/spring.factories em recursos e adicione a seguinte configuração
org.springframework.boot.autoconfigure.enableautoconfiguration = com.edu.mytest
3. Instale o projeto no repositório local do Maven: instalação de MVN
4. O projeto principal apresenta o frasco que acaba de ser instalado na área local.
<Depencency> <GrupidId> org.csp </groupiD> <stifactId> hello </stifactId> <versão> 1.0.0 </versão> </dependency>
5. Configure o executado agora
@SpringbooTApplicationPublic Classe principal {public static void main (string [] args) {springapplication application = new springapplication (main.class); ConfigurableApplicationContext context = Application.run (args); System.out.println (context.getBean (runnable.class)); }}6. Impressão do console
com.edu.mytestTicallambda$153/284686302@2c07545f
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.