SpringBoot原理详解

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));
        }
    }

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

  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());
        }
    }

13.

  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);
        }
    }

在这里插入图片描述

  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容器;
    在这里插入图片描述
SpringBoot 的自动装配原理是基于 Spring 框架的核心特性之一,即依赖注入(Dependency Injection)和控制反转(Inversion of Control)。通过自动装配,SpringBoot 可以根据一定的规则,自动将需要的依赖对象注入到相应的组件中,简化了开发者的配置工作。 在 SpringBoot 中,自动装配主要通过以下几个步骤实现: 1. ComponentScan:SpringBoot 会根据指定的包路径进行组件扫描,找到所有被注解标记的组件,如 @Component、@Service、@Repository 等。 2. ConditionalOnClass/ConditionalOnMissingClass:SpringBoot 会根据类路径中是否存在指定的类来判断是否需要装配某个组件。当类存在时,装配该组件;当类不存在时,跳过该组件。 3. ConditionalOnBean/ConditionalOnMissingBean:SpringBoot 会根据容器中是否存在指定的 Bean 来判断是否需要装配某个组件。当 Bean 存在时,跳过该组件;当 Bean 不存在时,装配该组件。 4. EnableAutoConfiguration:SpringBoot 提供了一系列以 Enable 开头的注解,用于开启特定功能的自动配置。这些注解会在特定条件下加载一些默认的配置类,将默认的配置注入到容器中。 5. 自定义配置:除了 SpringBoot 提供的默认自动配置之外,开发者还可以通过自定义配置文件(application.properties 或 application.yml)来覆盖默认配置,实现个性化的自动装配。 总的来说,SpringBoot 的自动装配原理就是根据一系列的条件和规则,将需要的依赖对象自动注入到相应的组件中,简化了开发者的配置工作,提高了开发效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值