9.10
引言:
不论在工作中,亦或是求职面试,Spring Boot已经成为我们必知必会的技能项。在我们快速开发项目时,一般都会用到Spring Boot,主要得益于Spring Boot 应用都只需要非常少量的配置代码(基于 Java 的配置),便能使得开发者能够更加专注于业务逻辑,快速开发项目,减轻很多繁琐的造轮子。当然,作为Spring Boot的精髓,自动配置原理的工作过程往往只有在“面试”的时候才能用得上,但是如果在工作中你能够深入的理解Spring Boot的自动配置原理,将无往不利。
SpringBoot自动配置的实现原理:
在我们创建的每一个Springboot项目时,都必定会有一个启动类。并且有一个@SpringBootApplication注解,这个注解是Spring Boot项目必不可少的注解。那么自动配置原理一定和这个注解有着千丝万缕的联系!
import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class ShiroActionApplication {public static void main(String[] args) {
SpringApplication.run(ShiroActionApplication.class, args); }
}
当我们把鼠标放在这个注解上的时候,可以看到里面有着一个@EnableAutoConfiguration注解。这个注解的作用就是开启自动配置。自动载入应用程序所需的所有Bean到当前SpringBoot创建并使用的IoC容器。
我们使用鼠标点击@EnableAutoConfiguration注解,便会看到他下边的这些注解。这里的关键功能是@Import注解,使用该注解来完成导入配置的功能。
在AutoConfigurationImportSelector类中可以看到通过SpringFactoriesLoader.loadFactoryNames方法进行扫描具有META-INF/spring.factories文件的jar包。
public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
public static ListloadFactoryNames(Class> factoryClass, ClassLoader classLoader) {
String factoryClassName = factoryClass.getName(); try {
Enumeration urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION)); List result = new ArrayList<>(); while (urls.hasMoreElements()) {
URL url = urls.nextElement(); Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url)); String factoryClassNames = properties.getProperty(factoryClassName); result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames))); }return result; }catch (IOException ex) {throw new IllegalArgumentException("Unable to load [" + factoryClass.getName() +"] factories from location [" + FACTORIES_RESOURCE_LOCATION + "]", ex); }
}
将所有扫描到的加载到容器中,实现自动配置。
下图为所有扫描到的spring.factories自动配置列表,再项目启动时,会加载该类,实现自动配置。