SpringBoot自动配置原理

接下来我们来介绍一个能让springboot火的原因之一,SpringBoot自动配置原理

首先在我们启动springboot时它会通过@springBootApplication加载主类,然后通过@EnableAutoConfiguration启动自动配置。

现在才到了我们自动配置的过程,首先会调用主类的main()中的run方法,

package com.mohan.demo01;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Demo01Application {

    public static void main(String[] args) {
        SpringApplication.run(Demo01Application.class, args);//此run方法为自动配置的开始。
    }

}

进入run方法之后我们可以看出run()方法中又返回了一个run(),而且它实例化里我们的入口类,并返回,

然后继续来看我们返回的的run()中,它返回了一个SpringApplication实例对象并继续把我们的入口类一并返回。

此时我们又要进入到SpringApplication()中,我们来说一下这个方法中的代码的作用,

  public SpringApplication(ResourceLoader resourceLoader, Class... primarySources) {
        this.sources = new LinkedHashSet();
        this.bannerMode = Mode.CONSOLE;
        this.logStartupInfo = true;
        this.addCommandLineProperties = true;
        this.addConversionService = true;
        this.headless = true;
        this.registerShutdownHook = true;
        this.additionalProfiles = new HashSet();
        this.isCustomEnvironment = false;
        this.resourceLoader = resourceLoader;//资源加载器
        Assert.notNull(primarySources, "PrimarySources must not be null");
        //把传入的对象转化为List集合并添加到集合中
        this.primarySources = new LinkedHashSet(Arrays.asList(primarySources));
        /**通过这个方法来判断项目的类型,然后根据项目类型加载配置文件。
            项目类型分为:NONE,SERVLET,REACTIVE三种,
        */
        this.webApplicationType = WebApplicationType.deduceFromClasspath();
        /* 调用了带一个参构造方法,然后初始化ApplicationListener类,
                
        */        this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
        this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
        this.mainApplicationClass = this.deduceMainApplicationClass();
    }

 调用这个构造方法之后进入这个方法,又发现返回了一个带两个参数的构造方法,执行这个方法。

来到这个方法我们先看方法中的都干了什么事情,

 private <T> Collection<T> getSpringFactoriesInstances(Class<T> type, Class<?>[] parameterTypes, Object... args) {
        //类的资源加载器
        ClassLoader classLoader = this.getClassLoader();
        //这个集合存放的是META-INF/spring.factories 下自动配置类的全路径,加载时会判断类资源加载器是否为null来加载。
        Set<String> names = new LinkedHashSet(SpringFactoriesLoader.loadFactoryNames(type, classLoader));
        //把上面的集合额通过反射 一个个的返回自动配置类的实例。
        List<T> instances = this.createSpringFactoriesInstances(type, parameterTypes, classLoader, args, names);
        AnnotationAwareOrderComparator.sort(instances);
        return instances;
    }

此图就是SpringFactoriesLoader类中加载自动配置类的路径。

以上就是springboot自动配置的一个过程简单的描述,如果有不对的地方,还请各位大佬指点一二。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值