首页 > 其他分享 >0.o?让我看看怎么个事儿之SpringBoot自动配置

0.o?让我看看怎么个事儿之SpringBoot自动配置

时间:2024-01-17 16:47:49浏览次数:43  
标签:SpringBoot boot autoconfigure 自动 springframework 注解 Import 事儿 class

学习 SpringBoot 自动配置之前我们需要一些前置知识点:

Java注解,看完就会用

学会@ConfigurationProperties月薪过三千

不是银趴~是@Import!

@Conditional+@Configuration有没有搞头?


首先我们提出2个问题:

SpringBoot 是干什么的?

是用来简化 Spring 原生的复杂的 xml 配置的进阶框架。

自动配置是什么?

我们用另外一个问题回答这个问题。

我们在 SpringBoot 开发中,就写了几个配置,怎么连接上的数据库?

spring:
  datasource:
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://192.0.0.1:3306/test?useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: root

在新手村时期,我们照着教程生搬硬抄的时候可能也想过这个问题,今天就来简单探究一下。

再次强调:

看明白本篇内容需要前置知识点,尤其是 @Import 注解。

这一切都要从 @SpringBootApplication 注解讲起。

@SpringBootApplication

@SpringBootApplication 注解是一个复合注解,它由如下三个注解组成。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration  // 第一个
@EnableAutoConfiguration  // 第二个
@ComponentScan(excludeFilters = {  // 第三个
        @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM,
                classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
}
@SpringBootApplication
├── @ComponentScan
├── @SpringBootConfiguration
│   └── @Configuration
└── @EnableAutoConfiguration
    ├── @Import(AutoConfigurationImportSelector.class)
    └── @AutoConfigurationPackage
        └── @Import(AutoConfigurationPackages.Registrar.class)

@SpringBootConfiguration

@ComponentScan

@EnableAutoConfiguration

从注解的中文意思中也可以看出来,第三个 @EnableAutoConfiguration 是与我们自动配置紧密相关的。

我们先快速搞定前2个。

@SpringBootConfiguration

这个最简单,把头套摘下来,他就是一个普普通通的 @Configuration 注解包装而成而已,表示当前类是一个配置类。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration // 本体在这
public @interface SpringBootConfiguration {
}

@ComponentScan

可以指定basePackageClasses或basePackages(或其别名value)来定义要扫描的特定包。如果没有定义特定包,扫描将从声明此注解的类的包开始。

顾名思义就是扫描Component。

扫描哪里?

可以通过该注解的属性指定Spring应该扫描的包。如果没有指定包,则默认扫描声明 @ComponentScan 的类所在的包及其子包。

哪些Component?

使用 @Component, @Service, @Repository, @Controller 等注解的类。

扫描了做什么用?

将扫描到的组件注册为Spring的Bean,加入到ioC容器进行统一管理。

@EnableAutoConfiguration

这是自动配置的核心注解!

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}    

我们能看到,其中有2个注解:

@AutoConfigurationPackage

@Import(AutoConfigurationImportSelector.class)

@AutoConfigurationPackage

我们再点进去看一下,发现它又是一个 @Import 。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {

}

@Import(AutoConfigurationPackages.Registrar.class) 中的 Regisgrar 类如下:

static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {

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

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

}

如果你有去好好看 @Import 注解的那篇文章,就会知道这是 ImportBeanDefinitionRegistrar 接口实现的方式。

这种方式提供一种手动方式灵活注册 bean。

在这里,我们根据两个提示就可以知道其功能:

• @AutoConfigurationPackage 是自动配置包的意思

• register(registry, new PackageImport(metadata).getPackageName()); 根据包名注册 bean

总结一下就是:

根据通过注解提供的元数据,动态地向 Spring 容器中注册特定包中的类作为 beans。

@Import(AutoConfigurationImportSelector.class)

如果你有去好好看 @Import 注解的那篇文章,就会知道这是 ImportSelector接口实现的方式。

这种方式只需实现 selectImports 方法,并以数组的形式返回要导入的类名,即可实现批量注册组件。

AutoConfigurationImportSelector 类中通过自己的源码实现了如下一个功能:

把 spring-boot-autoconfigure 依赖中 META-INF/spring.factories 文件中需要自动配置的类名读取到数组中。

它长这个样子:

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
...

那它到底怎么读取的?

这里我们不讨论具体实现,有兴趣有实力的可以扒源码自己看一下。

当然这些类不会全部都用到,经过筛选,去除重复、去除相应功能模块未开启的配置类、去除人为exclude掉的,将剩余的最终配置类全类名String数组返回。

最后我们再来回收一下开始的那个问题。

我们在 SpringBoot 开发中,就写了几个配置,怎么连接上的数据库?

我们简单捋一下:

SpringBoot 启动。

@SpringBootApplication 注解生效。

@EnableAutoConfiguration 注解生效。

@Import(AutoConfigurationImportSelector.class) 注解生效。

读取到了org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration。

注册一个数据源bean。

读取到 xml 的数据源配置。

大功告成!


往期推荐:

● 终于搞懂动态代理了!

● 学会@ConfigurationProperties月薪过三千

● 学一点关于JVM类加载的知识

● Java注解,看完就会用

● Java反射,看完就会用

● @Value是个什么东西

标签:SpringBoot,boot,autoconfigure,自动,springframework,注解,Import,事儿,class
From: https://www.cnblogs.com/cosimo/p/17970377

相关文章

  • nginx的https证书自动续期
    nginx的https证书自动续期本文讲述nginx的https证书如何自动续期。顺便讲述如何手动续期,如何方便地管理所有域名证书。有很多实现方案,包括收费方案和免费方案,本文采用的是acme.sh方案。1.安装acme客户端需要将系统环境切换到root用户下执行,否则安装证书时可能会失败......
  • SpringBoot+MybatisPlus+dynamic-datasources实现连接Postgresql和mysql多数据源
    场景dynamic-datasource-spring-boot-starter实现动态数据源Mysql和Sqlserver:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/117356693SpringBoot中整合MybatisPlus快速实现Mysql增删改查和条件构造器:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/detail......
  • 《机器人流程自动化能力评估体系 第1部分:系统和工具》行标发布
    2023年8月,工业和信息化部公告(2023年第17号)批准发布多项行业标准,由中国通信标准化协会提出并归口,中国信息通信研究院、南京新一代人工智能研究院牵头制定的YD/T4391.1-2023《机器人流程自动化能力评估体系第1部分:系统和工具》发布,标准已于2023年11月1日实施。该标准是RPA产业推进......
  • 网络-华为、思科交换机配置TFTP自动备份、NTP时间同步、SYSLOG日志同步功能
    前言如今园区中交换机越来越多,传统的查看日志的方式是远程到交换机在命令行中查看,但是logbuffer中保存的容量有限,也不方便查询,耗费运维人员大量的经理,不好集中管理,syslog就为解决此问题,可以搭建一台syslog服务器(我使用群辉自带的功能),将日志集中收集起来。同样的交换机的配置也......
  • SpringBoot中整合MybatisPlus快速实现Mysql增删改查和条件构造器
    场景Mybatis-Plus(简称MP)是一个Mybatis的增强工具,只是在Mybatis的基础上做了增强却不做改变,MyBatis-Plus支持所有Mybatis原生的特性,所以引入Mybatis-Plus不会对现有的Mybatis构架产生任何影响。MyBatis增强工具包,简化CRUD操作。启动加载XML配置时注入单表SQL操作,为简......
  • Spring Boot 自动配置机制全解析
    本篇博文旨在全面剖析SpringBoot的自动配置原理,为开发者提供深入理解其背后机制的视角。SpringBoot自动配置通过智能地推断所需配置,极大地简化了开发过程,优化了开发体验。1.SpringBoot自动配置的核心:@SpringBootApplicationSpringBoot应用的入口通常标注有@SpringBootAp......
  • Shopee买家通系统:领先科技助力卖家全自动化营销
    在虾皮卖家和服务商的竞争激烈的市场环境下,不断追求创新和效率提升是至关重要的。近期推出的Shopee买家通系统正是基于最新的防指纹防关联技术,以其独特的能力完全模拟真人运行,实现全自动化操作,为卖家们提供了一款卓越的营销工具。1、内置防指纹技术Shopee买家通系统内置先进的防指......
  • Springboot项目配置多数据源,然后任意切换
    数据库信息spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job_test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghaispring.datasource.username=rootspring.datasource.password=rootspring.datasource.sec......
  • 基于SpringBoot+Vue的校园招聘系统设计实现(源码+lw+部署文档+讲解等)
    (文章目录)前言:heartpulse:博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌:heartpulse:......
  • SpringBoot项目从0到1配置logback日志打印
    转载自:SpringBoot项目从0到1配置logback日志打印,作者sum墨一、写文背景我们在写后端项目的时候,日志打印是必需的。支持SpringBoot项目的日志框架一般有log4j、logback,这二者各有优劣,这里就不展开对比了。我们项目中常用的是logback框架,该框架主要是一个logback-spring.xml配置......