springboot如何开启自动配置


文章目录

  • 前言
  • Springboot的自动配置原理
  • 1.@SpringBootConfiguration注解
  • 2.@EnableAutoConfiguration注解(***)
  • 3.@ComponentScan注解
  • 总结



前言


  Springboot相较于传统的SSM框架的优势就是: (1)无需配置XML文件,内部集成大量配置,简化开发 (2)自动进行依赖的版本管理,避免版本冲突 (3)内部配置tomcat容器,简化项目部署

  今天就来说一说Springboot的自动配置


提示:以下是本篇文章正文内容,下面案例可供参考

Springboot的自动配置原理

  Springboot自动配置的核心就是@SpringbootApplication注解。使用该注解标注启动类实现自动配置。

@SpringBootApplication //实现自动配置
public class UserTest {//创建启动类
	//使用主方法启动项目
    public static void main(String[] args) {
        SpringApplication.run(UserTest.class,args);
    }
}

spring boot自动配置流程 springboot如何自动配置_java


  @SpringBootApplication注解中包含以下几个核心注解:

@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan

1.@SpringBootConfiguration注解

注解类源代码如下所示:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}

@Configuration注解是标注配置类的注解

使用@SpringBootConfiguration的作用是标注启动类是一个核心配置类

2.@EnableAutoConfiguration注解(***)

  @EnableAutoConfiguration注解的作用是根据SpringBoot 应用声明的依赖对 Spring 框架进行自动配置。
通过给容器中导入META-INF/spring.factories里定义的自动配置类,每一个自动配置类结合相应的xxxProperties.java读取配置文件,进行自动配置功能。
注解类源代码如下所示:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
    Class<?>[] exclude() default {};
    String[] excludeName() default {};
}

(1)@AutoConfigurationPackage :定义了springboot自动导入组件,需要遵循的规则。
  @Import({Registrar.class})//Registrar类会将启动类下的子包中的所有组件注入的spring中

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({Registrar.class})//Registrar类会将启动类下的子包中的所有组件注入的spring中
public @interface AutoConfigurationPackage {
}

(2)@Import({AutoConfigurationImportSelector.class})真正开启自动导入的注解。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {Class<?>[] value();}

AutoConfigurationImportSelector类中的selectImports方法完成自动配置的导入

public String[] selectImports(AnnotationMetadata annotationMetadata) {
        if (!this.isEnabled(annotationMetadata)) {
            return NO_IMPORTS;
        } else {
            AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
            AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata);
            return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
        }
    }

该方法中的this.getAutoConfigurationEntry方法是用来执行自动配置的操作

protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata, AnnotationMetadata annotationMetadata) {
        if (!this.isEnabled(annotationMetadata)) {
            return EMPTY_ENTRY;
        } else {
            AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
            //核心是这个方法
            List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
            configurations = this.removeDuplicates(configurations);
            Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
            this.checkExcludedClasses(configurations, exclusions);
            configurations.removeAll(exclusions);
            configurations = this.filter(configurations, autoConfigurationMetadata);
            this.fireAutoConfigurationImportEvents(configurations, exclusions);
            return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
        }
    }

List configurations = this.getCandidateConfigurations(annotationMetadata, attributes)该方法进行核心操作。

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
		//使用SpringFactoriesLoader进行配置的加载
        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
        Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
        return configurations;
    }

SpringFactoriesLoader.loadFactoryNames
  获取spring-boot-autoconfigure-2.1.6.Release.jar中的META-INF/spring.factories文件

3.@ComponentScan注解

  由于@EnableAutoConfiguration注解只能扫描当前类,不方便管理Controller包的类,因此,使用@ComponentScan注解来配置扫描包的范围。
  我们可以使用@ComponentScan来定义包扫描的规则。

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
	//略...
}

总结

提示:这里对文章进行总结:
例如:以上就是今天要分享的内容,本文仅仅简单介绍了Springboot的自动配置的原理,@SpringBootApplication注解的主要机制。