SpringBoot自动配置原理

1、前言

第一个次听说,Springboot的时候,感觉他是一个流行的框架,但是当我真正去学习它,才发现Springboot是基于Spring的,他并不是一个新的框架,只是他做了需要我们自己去做的Spring bean的配置。在Spring boot流行之前,我们采用springmvc框架来开发web应用,那是我们需要写许多配置文件,在Spring支持注解开发后,在一定程度上简化了配置,但是还是相对来说比较麻烦。这时候Springboot就体现出他的优势,springboot只需要一个properties或者yml文件就可以简化spring mvc中在xml中需要配置的一大堆的bean,这就是因为springboot有自动配置,那么自动配置原理是什么呢?

2、正文

我们知道Springboot可以帮助我们减少很多配置,它的核心理念就是约定大于配置,下面我们看一下是如何实现的。

首先从主程序入手

@SpringBootApplication
public class BootWeb01Application {

    public static void main(String[] args) {
        SpringApplication.run(BootWeb01Application.class, args);
    }

}

@SpringBootApplication这是一个主程序标识,我们点进去,可以看出它是由一系列注解组合而成的,我们重点关注
在这里插入图片描述
@SpringBootConfiguration
我们点进去之后,发现是@Configuration注解,这就是说通过@Configuration注解配置类代替xml文件配置
在这里插入图片描述
@ComponentScan
组件扫描注解,这个注解会自动注入所有在主程序所在包下的组件,所以我们在写程序的时候,需要把我们写的程序放在主程序目录下。
@EnableAutoConfiguration
开启自动配置功能,接把bean装配到ioc容器中,@EnableAutoConfiguration也是一个组合注解,我们点进去看一下
在这里插入图片描述
注意@Import({AutoConfigurationImportSelector.class}),我们点进去看一下,配置信息是从哪里来的
在这里插入图片描述
在这部分中,核心方法是getCandidateConfigurations,我们来看下这个方法

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
        //从工厂中获取自动配置类
        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
                getBeanClassLoader());
        //这句断言很重要,告诉了我们工厂是去哪里找自动配置类的,这里显然META-INF/spring.factories是一个路径
        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;
    }

我们按照路径,找到配置文件
在这里插入图片描述
这里面有所有的Spring相关配置
部分截图如下
在这里插入图片描述
小结:springboot所有的自动配置在启动的时候扫描并加载:META-INF/spring.factories里面的所有配置类,但是不一定生效,要判断条件是否成立,只要导入相应的start,就有对应的启动器,有了启动器,我们的自动配置就会生效。

3、总结

Spring Boot通过@EnableAutoConfiguration注解开启自动配置,加载META-INF下的spring.factories中注册的各种AutoConfiguration类,当自动配置类满足其注解@Conditional指定的生效条件,也就是有了对应的启动器,自动配置生效,并注入Spring容器,就可以完成依赖框架的自动配置。


版权声明:本文为weixin_43099842原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。