当前位置: 首页 > news >正文

springboot自动配置

自动配置的核心就在@SpringBootApplication注解上,SpringBootApplication这个注解
底层包含了3个注解,分别是:
@SpringBootConfiguration
@ComponentScan
@EnableAutoConfiguration
@EnableAutoConfiguration这个注解才是自动配置的核心,它 封装了 @Import 注解( Import 注解中指定了一个 ImportSelector接口的实现类,重写了 selectImports()方法
在实现类重写的 selectImports() 方法,读取当前项目下所有依赖 jar 包中
META-INF/spring.factories
        
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
两个文件里面定义的配置类(配置类中定义了 @Bean 注解标识的方法)。
而selectImports()方法中会去读取两份配置文件,并将配置文件中定义的配置类做为
selectImports()方法的返回值返回,返回值代表的就是需要将哪些类交给Spring的IOC
容器进行管理。
那么所有自动配置类的中声明的bean都会加载到Spring的IOC容器中吗? 其实并不会,因
为这些配置类中在声明bean时,通常都会添加@Conditional开头的注解,这个注解就是进
行条件装配。而Spring会根据Conditional注解有选择性的进行bean的创建。
@Enable 开头的注解底层,它就封装了一个注解 import 注解,它里面指定了一个类,是
ImportSelector 接口的实现类。在实现类当中,我们需要去实现 ImportSelector
接口当中的一个方法 selectImports 这个方法。这个方法的返回值代表的就是我需要将
哪些类交给 spring 的 IOC容器进行管理。
此时它会去读取两份配置文件,一份儿是 spring.factories,另外一份儿是
autoConfiguration.imports。而在 autoConfiguration.imports 这份儿文件
当中,它就会去配置大量的自动配置的类。
而前面我们也提到过这些所有的自动配置类当中,所有的 bean都会加载到 spring 的 IOC 容器当中吗?其实并不会,因为这些配置类当中,在声明 bean 的时候,通常会加上 这么一类@Conditional 开头的注解。这个注解就是进行条件装配。
所以SpringBoot非常的智能,它会根据 @Conditional 注解来进行条件装配。只有条件成立,它才会声明这 个bean,才会将这个 bean 交给 IOC 容器管理。
@Conditional
我们在跟踪SpringBoot自动配置的源码的时候,在自动配置类声明bean的时候,除了在方法上加了一
个@Bean注解以外,还会经常用到一个注解,就是以Conditional开头的这一类的注解。以
Conditional开头的这些注解都是条件装配的注解。下面我们就来介绍下条件装配注解。
@Conditional注解:
作用:按照一定的条件进行判断,在满足给定条件后才会注册对应的bean对象到Spring的IOC容
器中。
位置:方法、类@Conditional本身是一个父注解,派生出大量的子注解:
@ConditionalOnClass:判断环境中有对应字节码文件,才注册bean到IOC容器。
@ConditionalOnMissingBean:判断环境中没有对应的bean(类型或名称),才注册
bean到IOC容器。
@ConditionalOnProperty:判断配置文件中有对应属性和值,才注册bean到IOC容器。
http://www.lryc.cn/news/455832.html

相关文章:

  • mock数据,不使用springboot的单元测试
  • 【pytorch】pytorch入门5:最大池化层(Pooling layers )
  • 职场上的人情世故,你知多少?这五点一定要了解
  • Python | Leetcode Python题解之第456题132模式
  • 【重学 MySQL】五十四、整型数据类型
  • 查看 Git 对象存储中的内容
  • Redis 中热 Key 的判定及其解决方案
  • elasticsearch创建索引
  • 【STM32单片机_(HAL库)】4-2-1【定时器TIM】定时器输出PWM实现呼吸灯实验
  • 计算机网络:物理层 —— 信道复用技术
  • 期权懂|期权交易涨跌幅限制会随时调整吗?
  • 阿里面试: RocketMQ如何实现每秒上十万QPS的超高吞吐量读取的?
  • web:js原型污染简单解释
  • 【C++打怪之路Lv7】-- 模板初阶
  • 实战OpenCV之模板匹配
  • 【C++ 11】for 基于范围的循环
  • 创建索引时需要考虑的关键问题详解
  • 【JavaEE】【多线程】Thread类讲解
  • 硬件面试(一)
  • 9-贪心算法
  • 前端编程艺术(3)---JavaScript
  • 动态规划算法题目练习——91.解码方法
  • 每天一个数据分析题(四百九十二)- 主成分分析与因子分析
  • Linux shell编程学习笔记86:sensors命令——硬件体温计
  • 基于SSM车位租赁系统【附源码】
  • JAVA开源项目 新生报到网站 计算机毕业设计
  • QT将QBytearray的data()指针赋值给结构体指针变量后数据不正确的问题
  • 修改银河麒麟操作系统V10(SP1)网卡名称为ethx
  • MySQL多表查询:标量子查询
  • C++学习笔记----8、掌握类与对象(六)---- 操作符重载(1)