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);
}
}
@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注解的主要机制。