SpringBoot -- 自动配置机制

使用SpringBoot框架可以让我们快速的构建一个web项目并能成功运行,而之前的SSM则需要我们大量的配置。那么,SpringBoot为什么可以如此神奇,这是怎么做到的呢?那就要介绍一下SpringBoot的自动配置机制。那么,SpringBoot的自动配置机制又是怎么完成相关工作的?

使用SpringBoot快速构建web项目,有几个核心部分,下面就对其进行主要介绍。

1. 场景启动器(starter)

在我们通过SpringBoot构建项目时,必须要在依赖中导入相关的场景启动器,例如web场景对应的spring-boot-starter-web。那么,场景启动器是什么呢?包含哪些内容?

  • 场景启动器会导入相关场景的所有依赖:例如web场景中会导入starter-jsonstarter-tomcatspringmvc

  • 每个场景启动器都会引入spring-boot-starter,也就是核心场景启动器。要注意的是,无论导入的是什么场景,对应的场景启动器都会导入spring-boot-starter。换句话说,它在所有项目中都存在,因此它其中会包含通用的东西。

  • 核心场景启动器引入了spring-boot-autoconfigurespring-boot-autoconfigure里面囊括了所有场景的所有配置类。也就是说,如果这个包下的所有配置类都能生效,那么SpringBoot帮我们整合好的功能就都可以直接使用。

  • 但SpringBoot默认扫描不到 spring-boot-autoconfigure下写好的所有配置类。因为SpringBoot默认只扫描主程序所在的包。

2. 主程序

使用SpringBoot构建项目后,会有一个主程序,也就是程序运行的入口,相当于main函数。其上会有注解@SpringBootApplication标注,那么这个标注又在完成什么事情呢?

  • @SpringBootApplication由三个注解组成@SpringBootConfiguration@EnableAutoConfiguratio@ComponentScan
    • @SpringBootConfiguration注解与@Configuration注解功能相同,声明这是个配置类。
    • @ComponentScan我们也很熟悉,可以指定组件扫描的路径。因此,我们也可以直接通过@SpringBootApplication指定扫描路径。
    • SpringBoot默认只能扫描自己主程序所在的包及其下面的子包。
  • @EnableAutoConfiguration是SpringBoot 开启自动配置的核心:
    • 其源码中包含@Import(AutoConfigurationImportSelector.class),可以批量给容器中导入组件。
    • 因此,SpringBoot项目启动的时候利用 @Import 批量导入组件机制把spring-boot-autoconfigure包下的xxxxAutoConfiguration类导入进来(自动配置类)。
    • 虽然导入了包下所有的配置类,但并不是每一个配置类都能生效。每一个配置类都标注了条件注解@ConditionalOnxxx,只有条件成立,才能生效 。

3. xxxxAutoConfiguration自动配置类

根据前文所述,所有的SpringBoot项目都包含spring-boot-starter,而spring-boot-starter引入了spring-boot-autoconfigurespring-boot-autoconfigure又包含了很多官方已经整合好的配置类,也就是 xxxxAutoConfiguration。那么,配置类是怎么配置的呢?

  • 配置类会使用@Bean 给容器中放相关组件。

  • 许多自动配置类都有注解@EnableConfigurationProperties(ServerProperties.class),用来把配置文件中指定前缀的属性值封装到 xxxProperties属性类中。例如,@EnableConfigurationProperties(ServerProperties.class)会把配置文件中server下所有的配置值都映射到ServerProperties这个类中的属性值。

  • 给容器中放的所有组件的一些核心参数,都来自于xxxProperties。xxxProperties都是通过注解和配置文件绑定的。

  • 因此,我们只需要改配置文件的值,核心组件的底层参数都能修改。

4. 总结

  • 我们导入场景启动器,最终就会引入spring-boot-autoconfigure

  • spring-boot-autoconfigure有一个文件,META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,里面包含着许多自动配置类,也就是xxxxAutoConfiguration

  • 通过主程序注解中的@EnableAutoConfiguration,把所有的xxxxAutoConfiguration都导入进来

  • 每个xxxxAutoConfiguration会根据自己的条件注解@ConditionalOnxxx进行按需加载,用不到的就不会进行加载

  • xxxxAutoConfiguration会通过注解@EnableConfigurationProperties()xxxProperties与配置文件进行绑定,获取自定义的的配置

  • xxxAutoConfiguration给容器中导入相关组件,组件都是从 xxxProperties中提取属性值

这样,通过SpringBoot的自动配置机制,我们只需要导入starter、修改配置文件,就能修改底层行为,根据我们的需求进行自定义配置。

相关推荐

  1. SpringBoot -- 自动配置机制

    2024-03-29 14:44:04       19 阅读
  2. SpringBoot 自动配置原理

    2024-03-29 14:44:04       36 阅读
  3. Springboot自动配置原理

    2024-03-29 14:44:04       13 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-29 14:44:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-29 14:44:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-29 14:44:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-29 14:44:04       20 阅读

热门阅读

  1. 牛客的一道题(C)变种水仙花

    2024-03-29 14:44:04       15 阅读
  2. Qt使用事件过滤器

    2024-03-29 14:44:04       15 阅读
  3. Pytorch nn.Linear()

    2024-03-29 14:44:04       18 阅读
  4. mybatis plus 数据权限插件在项目中的使用

    2024-03-29 14:44:04       17 阅读
  5. C语言——函数练习程序

    2024-03-29 14:44:04       20 阅读
  6. 解决跨域问题

    2024-03-29 14:44:04       21 阅读
  7. svg怎么用,后端返回svg文件流引入

    2024-03-29 14:44:04       17 阅读
  8. 2024.03.15 校招 实习 内推 面经

    2024-03-29 14:44:04       20 阅读
  9. NGINX安装Stream模块

    2024-03-29 14:44:04       18 阅读
  10. 山东专精特新申报基本要求

    2024-03-29 14:44:04       17 阅读