SpringBoot原理详解

SpringBoot是由Pivotal团队提供,旨在简化Spring应用搭建与开发的框架。它通过自动配置减少样板代码,整合多种框架,支持快速构建企业级应用,包括嵌入式Web服务器和系统监控等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 自动装配原理深入解析 SpringBoot 的自动装配机制是其核心特性之一,它通过一系列注解和配置文件实现了开箱即用的功能。以下是对其工作原理的详细分析: #### 1. **核心注解** `@EnableAutoConfiguration` 是自动装配的核心注解[^3]。它的作用是对 Spring ApplicationContext 进行自动化配置,尝试猜测并注册应用程序可能需要的 Bean。具体来说,该注解会扫描类路径中的依赖项,并根据这些依赖项加载相应的配置。 ```java @Configuration @ConditionalOnClass({ Servlet.class }) @Import(AutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration { } ``` - `@Configuration`: 表明这是一个配置类。 - `@ConditionalOnClass`: 只有当指定的类存在于类路径中时,才会生效。 - `@Import(AutoConfigurationImportSelector.class)`: 导入了一个名为 `AutoConfigurationImportSelector` 的类,用于决定哪些自动配置类应该被应用。 --- #### 2. **自动配置的选择逻辑** `AutoConfigurationImportSelector` 类负责处理自动配置类的选择过程。它主要依据以下几个方面完成任务: - **META-INF/spring.factories 文件**: 在每个 Starter 组件中,都会提供一个 `spring.factories` 文件,其中定义了一系列候选的自动配置类。例如,在数据库相关的 Starter 中可能会包含如下内容: ```properties org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration ``` - **条件化装配 (Condition-based Configuration)**: 每个自动配置类都带有特定的条件注解(如 `@ConditionalOnClass`, `@ConditionalOnMissingBean`),只有满足这些条件时,对应的 Bean 才会被创建。这使得 SpringBoot 能够灵活适应不同的运行环境。 --- #### 3. **复合注解的作用** 除了单独使用 `@EnableAutoConfiguration` 外,通常还会配合其他注解一起使用,比如 `@SpringBootApplication`。实际上,`@SpringBootApplication` 就是一个复合注解,包含了以下三个部分[^4]: - `@SpringBootConfiguration`: 定义当前类为一个配置类[^5]。 - `@EnableAutoConfiguration`: 启用自动配置功能。 - `@ComponentScan`: 开启组件扫描,以便发现并注册项目中的 Bean。 因此,开发者只需在一个主类上标注 `@SpringBootApplication` 即可实现完整的初始化流程。 --- #### 4. **实际案例演示** 假设我们需要快速搭建一个 Web 应用程序,则可以通过引入 Spring Boot Web Starter 来简化开发过程。下面展示如何利用自动装配构建一个简单的 RESTful API: ```java @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @RestController static class HelloController { @GetMapping("/hello") public String sayHello() { return "Hello, World!"; } } } ``` 在这个例子中,由于导入了 Spring Boot Web Starter,框架会自动检测到 Tomcat 和 DispatcherServlet 存在于类路径中,并相应地配置好嵌入式的 HTTP Server 和 MVC 支持。 --- #### 总结 SpringBoot 的自动装配机制极大地降低了传统 Spring 项目的复杂度,使开发者能够专注于业务逻辑而非繁杂的基础设置。通过对 `@EnableAutoConfiguration`、`AutoConfigurationImportSelector` 以及各种条件注解的学习,可以更好地掌握这一强大工具的工作方式。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值