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

这篇具有很好参考价值的文章主要介绍了0.o?让我看看怎么个事儿之SpringBoot自动配置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

学习 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是个什么东西文章来源地址https://www.toymoban.com/news/detail-798288.html

到了这里,关于0.o?让我看看怎么个事儿之SpringBoot自动配置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 财务共享领先实践,看看他们是怎么做的

    随着信息技术的快速发展,由于创新商业模式的出现,金融结构、操作策略和流程正在发生变化。大数据、云计算、人工智能、机器人流程自动化(RPA)等新兴技术正在应用于金融及财务领域,以优化财务管理流程并提高运营效率。财务共享作为一种系统的管理方案,将组织

    2024年02月06日
    浏览(36)
  • 【C语言】【数据结构初阶】 快排变慢排?怎么个事儿?

    我们知道,快排是一种很好的排序算法。但是在 极少数 的一些情况下,“快速排序”好像名不副实了。 当数据量非常大,且递归深度太深,有栈溢出的风险。 这样,我们就得到了一个很可惜的结论:快排不是万金油。 但是,这是指的 递归版本 的快排,我们可以写 非递归

    2024年02月17日
    浏览(54)
  • CSDN为什么会发展社区?看看官方怎么说

    哈喽,大家好,我是几何心凉,这是一份全新的专栏,唯一得到CSDN王总的授权,来对于我们每周四的绿萝时间 ——【直达CSDN】直播内容进行总结概括,让大家能够省去看直播回放的时间也能够了解直播内容和官方的最新动态,希望大家给予凉哥最大的支持,如有未授权用户

    2024年02月17日
    浏览(43)
  • SpringBoot 自动配置--常用配置

    😀前言 本篇博文是关于SpringBoot 自动配置的一些分享,希望能够帮助到您😊 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉 💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的

    2024年02月14日
    浏览(28)
  • 想知道怎么在期权市场买卖上证50指数?点击进来看看!

    可以通过期权的方式进行买卖上证50指数,国内期权的交易标的就是上证50ETF指数。期权是以股指为标的物的期权合约,通俗来说就是判断股指的涨跌,获得收益的一种投资。以下就是想知道怎么在期权市场买卖上证50指数?点击进来看看! 本文来自:财顺期权 一、上证50ET

    2024年03月19日
    浏览(49)
  • 好奇一键ai绘画怎么使用吗?看看照片ai绘画生成器怎么用吧

    丽丽:嘿,小明!你听说过照片ai绘画生成器吗? 小明:我听说过它!据说它可以将普通照片转换成惊人的艺术绘画作品。 丽丽:是的,没错!我最近下载了一个照片ai绘画生成器的应用,它使用了前沿的人工智能技术,能够给照片增添艺术感。 小明:听起来很有趣!你可以

    2024年02月14日
    浏览(49)
  • 【SpringBoot】SpringBoot的自动配置源码解析

    SpringBoot相对于SSM来说,主要的优点就是简化了配置,不再需要像SSM哪有写一堆的XML配置,这些XML配置在大项目上会成为一种累赘,使得后期项目难以维护。 SpringBoot的出现,使得开发者不再关注于配置,能够更加专注于业务的开发,这得益于SpringBoot的自动配置。 SpringBoot的自

    2024年02月16日
    浏览(29)
  • 怎么理解 SpringBoot 的约定大于配置?

    \\\"约定大于配置\\\"是一种设计理念,它在Spring Boot框架中得到了广泛应用。这一理念的核心思想是,通过在开发框架中定义一些默认的约定和规则,从而减少开发人员需要配置的工作,使开发更加高效,同时提高了项目的可维护性和可读性。 在 Spring Boot 中,\\\"约定大于配置\\\"的思

    2024年02月08日
    浏览(29)
  • SpringBoot自动配置原理

    springboot是基于spring的新型的轻量级框架,最厉害的地方当属**自动配置。**那我们就可以根据启动流程和相关原理来看看,如何实现传奇的自动配置 从上面代码可以看出,Annotation定义(@SpringBootApplication)和类定义(SpringApplication.run)最为耀眼,所以要揭开SpringBoot的神秘面纱

    2024年01月21日
    浏览(41)
  • SpringBoot自动配置的原理

    以WebMvcAutoConfiguration自动配置的原理为例,SpringBoot内部对大量的第三方库或Spring内部库进行了默认配置,这些配置是否生效,取决于我们是否引入了对应库所需的依赖,如果有那么默认配置就会生效。如果引入springboot-starter-web那么对应的web配置就会自动配置。那么是如何自动

    2024年02月09日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包