SpringBoot高级——————自动配置

前言:

  相信大家在学完SpringBoot之后,都会有这样一个感慨:“真牛X”。都知道SpringBoot最D的地方在于它的起步依赖和自动配置,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。那么,今天小编就来说说它的自动配置。一起来看看吧…

引导类

最神奇,最核心的地方就是引导类。引导类有两大关键所在:

  1. run方法
    run方法(还未深挖),概括就是创建SpringApplication对象和创建context对象,并且通过自动配置实例化出所有的对象。
    提一嘴:想了解这个应该需要先了解下它的监听机制。
  2. @SpringBootApplication注解
    我们知道在引导类上有个@SpringBootApplication注解,这个注解也就是本篇的主旨。

@SpringBootApplication注解

我们只需要点进去就会发现,这是个复合注解。加载所有自动化配置的类:
在这里插入图片描述
前四个是原生注解,不做赘述,下面三个是要说的重点。

@ComponentScan

@ComponentScan该注解默认会扫描该类所在的包下所有的配置类,相当于之前的配置文件里的 <context:component-scan >可以扫描当前包及其子包的所有注解。

@SpringBootConfiguration

此注解点进去发现它是对@Configuration注解的封装,也就意味着 引导类也是个配置类,可以配置Bean。

@EnableAutoConfiguration

核心:当中@import注解的四大作用

  1. 声明一个bean
  2. 导入@Configuration注解的配置类
  3. 导入ImportSelector的实现类
  4. 导入ImportBeanDefinitionRegistrar的实现类

源码中用了第三种,如图:
自动配置导入选择器
我们接着跟进:有一个selectImports方法,返回字符串数组,当中调用了getAutoConfigurationEntry方法。
在这里插入图片描述
getAutoConfigurationEntry方法里获取了自动配置的条目,我们无需看懂每行代码,看准有个获取候选配置即getCandidateConfigurations方法,返回值是个集合。
在这里插入图片描述
那么getCandidateConfigurations方法里做了啥呢?继续跟进,就不截图了。跟进loadFactoryNames,当中调用loadSpringFactories到 META-INF/spring.factories配置文件下获取所有的制定资源的名称集合。
在这里插入图片描述

根据条件初始化自动配置类中的对象

AutoConfigurationImportSelector类中selectImports方法中有StringUtils.toStringArray(autoConfigurationEntry.getConfigurations()); 处理结果后转成了字符串数组(里面拿到的是所有自动配置类的全类名)。在这一步,就已经完成一大半了。
注意:spring并不是对所有的自动配置类创建对象,而是取决于@ConditionalOnXXX注解。拿redis举例来说:
也就是当有RedisOperations类时底下的Bean才初始化,也就是我们当我们加了spring-boot-starter–data-redis依赖。@ConditionalOnMissingBean注解表示有同名的就不再创建,控制了只会创建一个Bean。配置类

自动化数据的配置

根据自动化配置的@EnableConfigurationProperties注解,进入RedisProperties,我们可以看到各个配置。
prefix的值是配置的前缀,类中属性就是配置项。在这里插入图片描述
注意:redis配置是有默认值的,host:localhost,port:6379。如不一致,需要在yml中配置自己的,否则启动时可能会出错。也证明了 springboot的依赖不能乱加。
最后:这些配置可参考官方文档,也可在idea中直接双击shift搜索。例如:mongoauto即可查到mongo的自动配置类。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值