注意:文章中代码段删除了非关键代码,以免干扰读者的关注点。(下面以spring-boot-starter-web为例进行解析)
启动类上应用@SpringBootApplication注解
@SpringBootApplication
public class RestserviceApplication {
public static void main(String[] args) {
SpringApplication.run(RestserviceApplication.class, args);
}
}
@SpringBootApplication注解上应用了@EnableAutoConfiguration注解,使Spring实例化自动配置类
@EnableAutoConfiguration
public @interface SpringBootApplication {
//...
}
Spring Boot自动配置机制从核心上可以总结为以下两点:
通过@EnableAutoConfiguration为基于Spring的应用开启自动配置机制;
通过一系列的@Conditional完成自动配置机制的实现;
1、通过@EnableAutoConfiguration为基于Spring的应用开启自动配置机制;
@EnableAutoConfiguration注解可以让Spring开启自动配置机制。
查看源码,发现SpringApplication.run(...) 调用 getRunListeners(...) 调用 getSpringFactoriesInstances(...) 调用 SpringFactoriesLoader.loadFactoryNames(...),读取资源文件spring.factories,将自动配置类名加载到缓存中
org.springframework.boot.autoconfigure.AutoConfigurationImportSelector实现了org.springframework.context.annotation.ImportSelector接口。Spring会调用ImportSelector接口selectImports方法获取需要实例化的自动配置类,并进行自动配置。
org.springframework.boot.autoconfigure.AutoConfigurationImportSelector的getCandidateConfiguration方法获取在spring.factories中,key为EnableAutoConfiguration 下面的所有自动配置类名(****AutoConfiguration类)(此时从缓存中获取,因应用启动时已缓存),最后通过ImportSelector接口selectImports方法返回给Spring进行实例化,根据条件启动自动配置。
关于spring.factories 介绍及自动配置类在SpringBoot启动时加载也可参考 https://blog.csdn.net/cqupt2012214390/article/details/106636126
2、通过一系列的@Conditional完成自动配置机制的实现;
@Condition条件来决定是否开启并注册到Spring上下文中。
@Condition则可以根据一系列条件来决定是否启用某项配置,这些条件可以是:
·在classpath下是否存在指定的类;
·在ApplicationContext中是否已存在指定类型的Bean;
·在指定目录下是否存在指定的文件;
·在配置文件中是否配置了指定的属性;
·指定的系统属性是否存在或不存在;
……
下面先重点介绍自动配置类(****AutoConfiguration类)
spring-boot-starter-web pom文件,关键是引入了spring-boot-starter-tomcat、spring-web及spring-webmvc,SpringBoot根据classpath和环境等条件推测构建Web项目,相应的自动配置类根据条件生效,随即自动完成web及SpringMVC的默认配置,省去了程序员自己做大量重复配置。
条件:不仅限于引入的class,属性配置及各种能够获取到的环境因素也能成为自动配置类是否生效的条件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>2.4.5</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.6</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.6</version>
<scope>compile</scope>
</dependency>
WebMvcAutoConfiguration 自动配置类
WebMvcProperties 属性类
自动配置包括下面三方面内容:
1、根据pom依赖引入的类等条件决定哪些自动配置类生效
2、根据条件配置合适的bean
3、根据属性类设置bean的属性值
自动配置类(****AutoConfiguration)作用:替代了以前XML的功能,同时能根据条件生效,达到自动配置的效果。根据条件配置bean、同时根据属性类(****Properties类)设置bean的属性值。
属性类(****Properties类)作用:
1、定义了默认属性值
2、可通过来自 JVM系统属性、环境变量、命令行参数、应用程序属性配置(如application.properties或application.yml) 四个属性源的属性值覆盖默认值
总结:应用启动时,SpringFactoriesLoader类loadFactoryNames方法加载spring.factories资源文件中key-value形式的配置信息到缓存中,AutoConfigurationImportSelector实现了ImportSelector接口selectImports方法,以EnableAutoConfiguration为key,从缓存中获取自动配置类名(前提:应用了@EnableAutoConfiguration注解),返回给Spring根据@Conditional注解上条件进行实例化及自动配置