SpringBoot自动配置原理入门
1.@SpringBootApplication
程序主入口
2.
@SpringBootConfiguration
@EnableAutoConfiguration//自动配置核心
@ComponentScan
@SpringBootConfiguration是一个核心配置类,类似于@configuration
@ComponentScan包扫描,指定扫描哪些
@EnableAutoConfiguration
@AutoConfigurationPackage//自动配置包
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
1.@AutoConfigurationPackage
@Import({Registrar.class}) //给容器中导入一个组件
public @interface AutoConfigurationPackage {
Registrar:利用Registrar给容器中导入一系列组件,将指定的一个包下的所有组件导入进来(@SpringBootApplication所修饰的类所在的包下)
2.@Import({AutoConfigurationImportSelector.class})
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
return NO_IMPORTS;
} else {
AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata);
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
}
this.getAutoConfigurationEntry(annotationMetadata);
1.利用this.getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件
2.List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);获取到所有需要导入容器中的配置类
3.利用工厂加载Map<String,List<String>> loadSpringFactories(@Nullable ClassLoader classLoader); 得到所有的组件
4.从META-INF/spring.factories位置来加载一个文件
默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件(有的包下面有spring.factories,但是有的包下没有)
spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories
文件里面完全写死了spring-boot已启动就要给容器中加载的所有配置
按需开启自动配置项
在spring-boot-autoconfigure-2.3.4.RELEASE.jar包里META-INF/spring.factories有127个场景配置
虽然我们127个场景的所有自动配置启动的时候默认全部加载
按照条件装配规则(@Conditional),最终会按需配置
给@Bean标注的方法传入了对象参数,这个参数的值就会从容器中找。
SpringBoot默认会在底层配好所有的组件,但是如果用户自己配置了以用户的优先
@Bean
@ConditionalOnMissingBean //该注解表示如果有用户配置的就用用户的,没有则用底层的
public CharacterEncodingFilter characterEncodingFilter(){}
总结:
1.SpringBoot先加载所有的自动配置类 XXXAutoConfiguration
2.每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。XXXProperties里面拿。XXXProperties和配置文件进行了绑定。
3.生效的配置类就会给容器中装配很多组件
4.只要容器中有这些组件,相当于这些功能就有了
5.只要用户有自己配置的,就以用户的优先
6.定制化配置
用户直接自己@Bean替换底层的组件
用户去看这个组件时获取的配置文件是什么值就去修改
最佳实践
- 引入场景依赖
- 查看自动配置了那些(选做)
- 自己分析,引入场景对应的自动配置一般都生效(查看是否配置,自动配置报告,在配置文件中debug=true)
- 是否需要修改
- 参照文档修改配置项
- 自己分析,xxxProperties绑定了配置文件的哪些。
- 自定义加入或者替换组件@Component,@Bean
- 自定义器 xxxCustomizer
开发小技巧
1.Lombok
-
引入Lombok依赖
-
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> 并搜索安装lombok插件 @Data //get set方法 @ToString //toString()方法 @AllArgsConstructor //全参数的构造方法 @NoArgsConstructor //无参数的构造方法 @EqualsAndHashCode //重写HashCode方法 @Slf4j Lombok自带的日志输出可以使用log.info输入语句
2.dv-tools(热部署,这属于把项目重新运行一遍)
3.Spring Initailizr(项目初始化向导)
使用idea自带的Initailizr来进行一个SpringBoot项目的快速搭建
resources下的 static装的是静态资源 templates装的是页面 application.properties是配置文件