当前位置: 首页>编程语言>正文

spring boot机制 spring boot原理

SpringBoot是什么?

  1. Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。用我的话来理解,就是spring boot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,spring boot整合了所有的框架

SpringBoot的作用

  1. Spring Boot框架,它的作用很简单,就是帮我们自动配置。Spring Boot框架的核心就是自动配置,只要存在相应的jar包,Spring就帮我们自动配置。如果默认配置不能满足需求,我们还可以替换掉自动配置类,使用我们自己的配置。另外,Spring Boot还集成了嵌入式的Web服务器,系统监控等很多有用的功,让我们快速构建企业及应用程序。

SpringBoot原理

  1. 首先,我们新建一个SpringBoot项目,创建成功之后,就和我下面的图片差不多。
  2. 我们点击这个注解,@SpringBootApplication,我标出来的这三个注解,是非常重要的。
  3. 咱们再来点击@SpringBootConfiguration。
  4. @Configuration这个注解呢,就是用来读取之后我们提取出来的文件,spring.factories(我们稍后会讲到);
  5. 下面,我们回到刚才的SpringBootApplication这个类里面,再来看里面的@EnableAutoConfiguration这个注解,我们点进去,可以看到@AutoConfigurationPackage这个注解,
  6. 我们继续点击这个注解@AutoConfigurationPackage;
  7. 我们点进去Registrat.class;
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
        Registrar() {
        }

        public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
            AutoConfigurationPackages.register(registry, (new AutoConfigurationPackages.PackageImport(metadata)).getPackageName());
        }

        public Set<Object> determineImports(AnnotationMetadata metadata) {    
            return Collections.singleton(new AutoConfigurationPackages.PackageImport(metadata));
        }
    }

spring boot机制 spring boot原理,spring boot机制 spring boot原理_spring,第1张

这里返回的是demo这个bao内,以及这个包的子包下的所有类,以便于可以被Spring容器所托管。

spring boot机制 spring boot原理,spring boot机制 spring boot原理_配置文件_02,第2张

  1. 接下来,我们继续回到刚才的位置;
  2. 点击去这个AutoConfigurationImportSelector.class
  3. 可以看到,这个类继承了DeferredImportSelector这个类;咱们继续点进去这个 类看看;
  4. 可以看到这个类又继承了一个类,咱们继续点进去看;
  5. 可以看到,这个类里面有一个抽象方法,如果有一个类要实现这个接口的话,那么必须重写这个方法,是吧,那好,咱们下载从刚才的那个类中找到这个方法;
//从AutoConfigurationImportSelector这个类中找
public String[] selectImports(AnnotationMetadata annotationMetadata) {
        if (!this.isEnabled(annotationMetadata)) {
            return NO_IMPORTS;
        } else {
            AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
            AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata);
            return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
        }
    }

spring boot机制 spring boot原理,spring boot机制 spring boot原理_spring_03,第3张

  1. 可以看到,这个方法调用了这个方法getAutoConfigurationEntry(),咱们继续点进去看;
protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata, AnnotationMetadata annotationMetadata) {
        if (!this.isEnabled(annotationMetadata)) {
            return EMPTY_ENTRY;
        } else {
            AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
            List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
            configurations = this.removeDuplicates(configurations);
            Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
            this.checkExcludedClasses(configurations, exclusions);
            configurations.removeAll(exclusions);
            configurations = this.filter(configurations, autoConfigurationMetadata);
            this.fireAutoConfigurationImportEvents(configurations, exclusions);
            return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
        }
    }

spring boot机制 spring boot原理,spring boot机制 spring boot原理_spring_04,第4张

  1. 可以看到,这个方法又调用了getCandidateConfigurations这个方法,这门继续点进去;
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
        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;
    }
  1. 可以看到SpringFactoriesLoader这个类,咱们继续点进去看一下;
  2. 哈哈哈,终于找到这个配置文件了吧;咱们再这个目录下打开这个配置文件;
  3. 咱们继续回到刚才的@Configuration注解中,这个注解就是读取这个文件的;@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器;



https://www.xamrdz.com/lan/5s51987330.html

相关文章: