9.10

引言:

不论在工作中,亦或是求职面试,Spring Boot已经成为我们必知必会的技能项。在我们快速开发项目时,一般都会用到Spring Boot,主要得益于Spring Boot 应用都只需要非常少量的配置代码(基于 Java 的配置),便能使得开发者能够更加专注于业务逻辑,快速开发项目,减轻很多繁琐的造轮子。当然,作为Spring Boot的精髓,自动配置原理的工作过程往往只有在“面试”的时候才能用得上,但是如果在工作中你能够深入的理解Spring Boot的自动配置原理,将无往不利。

spring boot 配置 dwr spring boot 配置原理_springboot启动时自行方法

 

spring boot 配置 dwr spring boot 配置原理_springboot自动配置_02

 

spring boot 配置 dwr spring boot 配置原理_springboot自动配置原理_03

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容器。

spring boot 配置 dwr spring boot 配置原理_springboot原理_04

我们使用鼠标点击@EnableAutoConfiguration注解,便会看到他下边的这些注解。这里的关键功能是@Import注解,使用该注解来完成导入配置的功能。

spring boot 配置 dwr spring boot 配置原理_springboot原理_05

在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自动配置列表,再项目启动时,会加载该类,实现自动配置。

spring boot 配置 dwr spring boot 配置原理_springboot原理_06


spring boot 配置 dwr spring boot 配置原理_springboot自动配置原理_07

总结:

就是项目启动通过@EnableAutoConfiguration注解扫描所有的META-INF/spring.factories文件,将其注入加载,实现自动配置。Springboot底层已经帮我们封装了很多的配置,我们新写的配置文件他也会自动读取加载到里面。