1. ¿Por qué puedo lograr una configuración automática utilizando la anotación de @SpringBootApplication?
Respuesta: @SpringBootApplication, en realidad hay 3 anotaciones internas. @EnableAutoconfiguration, @ComponentsCan, @configuration. Este artículo explica principalmente la anotación @enablexx
2. ¿Por qué se usa @enableautoconfiguration? Cuando se usa @ConfigurationProperties, los elementos de configuración en .yml o .properties se pueden importar automáticamente?
Respuesta: Dentro de @enableAutoconfiguration, se usa la anotación @import. Importar AutoconfigurationImportSelector ayuda a Springboot a cargar la configuración calificada en el contenedor IOC. Pero el uso interno de SpringFactoriesLoader se usa para completarlo. Similar a Java SPI, es decir, la carga de la configuración de /meta-inf/spring.factories
@Target ({{elementType.type})@retención (retenciónPolicy.Runtime)@documentado@heredero@autoconfigurationPackage@import ({autoconfigurationImportSelector.class}) public @interface EntableutfigurationPuede ver que en @Import, una clase AutoconfigurationImportSelector realmente se importa. Lo más importante es que esta clase implementa la interfaz importselector
Interfaz pública ImportSelector { /** * Seleccione y devuelva los nombres de los cuales la clase (ES) debe importarse en función de * la clase {@link anotationMetadata} de la clase importadora@{@enlace}. */ String [] SelectImports (AnnotationMetadata importingClassMetadata);}Esta es la descripción de ImportSelector, que significa aproximadamente que el bean devuelto por este método será inyectado y administrado automáticamente por Spring.
A continuación, veamos la implementación de SelectImports en AutoconfigurationImportSelector
public String [] SelectImports (annotationMetadata annotationMetadata) {if (! this.isenable (annotationMetadata)) {return no_imports; } else {autoconfigurationMetadata AutoconfigurationMetadata = AutoconfigurationMetadataloader.LoadMetadata (this.BeanClassLoader); AnnotationAttributes atributos = this.getAttributes (anotationMetadata); List <String> configuraciones = this.getCandidateConfigurations (annotationMetadata, atributos); configuraciones = this. Establecer <string> exclusiones = this.getExClusions (annotationMetadata, atributos); this.checkexCludedClasses (configuraciones, exclusas); configurations.removeAll (exclusiones); configuraciones = this.filter (configuraciones, autoconfigurationMetadata); this. return stringUtils.ToStringarArray (configuraciones); }}El código está escrito muy claramente. No lo explicaré.
En @Import, puede ver que un enlace apunta a ImportBeanDefinitionRegistrar. Esta es también una interfaz, y su función es la misma que ImportSelector.
interfaz pública importeDefinitionRregistrar {public void registroBeanDefinitions (AnnotationMetadata ImportingClassMetadata, BeanDefinitionRegistry Registry);}En el método RegistroBeanDefinitions, puede usar BeanDefinitionRegistry para inyectar el bean que queremos inyectar.
Ejemplo de código:
Escribe tu propio @enable usando @import
1. Cree 2 frijoles de prueba
Rol de clase pública {} Public Class User {}2. Personalizar anotaciones de habilitación
@Target ({elementType.type})@retención (retenciónPolicy.Runtime)@documented@import (myenableAutoconfig.class) public @interface enableBean {}3. Implemente su propia clase de Enableautoconfiguration
La clase pública myEnableautoconfig implementa importselector {@Override public String [] selectImports (annotationMetadata importingClassMetadata) {return new String [] {"com.xhn2.role", "com.xhn2.user"}; }}4. Escribe una clase de inicio
@EnableBean@ComponentScan ("com.xhn2") public class Main {public static void main (string [] args) {configurureableApplicationContext context = springApplication.run (main.class, args); System.out.println (context.getBean (user.class)); System.out.println (context.getBean (rol.class)); }}5. Resultados de la operación
com.xhn2.user@496bc455
com.xhn2.role@59402b8f
La consola se imprime con éxito.
Código Ejemplo 2, ensamblaje automático del paquete de terceros jarras
Nuevo proyecto Maven
1. Pom.xml
<modelVersion> 4.0.0 </modelVersion> <MoupRid> org.csp </groupid> <artifactid> hola </arfactid> <verserse> 1.0.0 </versewers> <properties> <maven.compiler.source> 1.8 </maven.compiler.source> <maven.compiler.target> 1.8 </maven.compiler.source> <maven.compiler.target> 1.8 </maven.c.compiler.source> <maven.compiler.target> 1.8 </maven.compiler.source> <maven.compiler.target> 1.8 </maven.c.compiler. <Project.Build.SourceEncoding> UTF-8 </project.build.sourceEncoding> </propiESS> <Spendencies> <Spendency> <MoupRupid> org.springframework </proupId> <AtifactId> Spring-Context </artifactId> <Persion> 4.3.17.release </versever> </shantency>
2. Escribir configuración
@ConfigurationPublic Class mytest {@Bean public runnable runnable () {return ()-> {}; }}Cree un nuevo archivo Meta-Inf/Spring.Factories en Recursos y agregue la siguiente configuración
org.springframework.boot.autoconfigure.enableautoconfiguration = com.edu.mytest
3. Instale el proyecto en el repositorio maven local: MVN Install
4. El proyecto principal presenta el frasco que se acaba de instalar en el área local.
<Spendency> <ProupId> org.csp </groupid> <artifactid> hello </artifactid> <versión> 1.0.0 </versión> </pendency>
5. Obtenga el runnable configurado hace ahora
@SpringBootApplicationPublic Class Main {public static void main (string [] args) {SpringApplication Application = new SpringApplication (main.class); ConfiguableApplicationContext context = Application.run (args); System.out.println (context.getBean (runnable.class)); }}6. Impresión de consola
com.edu.mytest$$lambda$153/284686302@2c07545f
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.