Spring Boot自动配置原理

在传统的SSM框架集成中,需要编写大量的XML配置文件,比如集成Mybatis时,需要编写mybatis_config.xml文件,在集成springmvc时,需要编写springmvc.xml文件,这些配置文件十分繁琐,还很容易出现错误,导致开发效率低。而Spring Boot采用约定大于配置的思想,将大量的spring配置文件集成到Spring Boot的内部,帮助开发人员自动配置各类XML文件,极大的简化了开发过程。

步骤一:自动配置原理

Spring Boot自动配置的核心注解是@SpringBootApplication,该注解是spring boot的启动类注解,它是一个复合注解,里面包含:

(1)@SpringBootConfiguration:该注解上有一个 @Configuration注解,表示这个spring boot启动类是一个配置类,最终要被注入到spring容器中。

(2)@EnableAutoConfiguration:表示开启自动配置,它也是一个复合注解,里面包含:

① @AutoConfigurationPackage,该注解上有一个@Import(AutoConfigurationPackages.Registrar.class)注解,其中 Registrar 类的作用是将启动类所在包下的所有子包的组件扫描注入到spring容器中。

这也是为什么在spring boot中,我们通常将controller、pojo、service、dao等包放在启动类同级目录下的原因。

② @Import(AutoConfigurationImportSelector.class):其中AutoConfigurationImportSelector类中有一个getCandidateConfigurations()方法,该方法通过SpringFactoriesLoader.loadFactoryNames()方法查找位于META-INF/spring.factories文件中的所有自动配置类,并加载这些类。

spring.factories文件是以key-value键值对的形式存储文件里,其中有一个key=EnableAutoConfiguration,它对应的value值就是一个个以AutoConfiguration结尾来命名的 xxxAutoConfiguration 自动配置类。

所以spring boot在整个的启动过程中,其实就是在类路径的META-INF/spring.factories 文件中找到EnableAutoConfiguration对应的所有的自动配置类,然后将所有自动配置类加载到spring容器中。

所有自动配置类都是以AutoConfiguration结尾来命名的,而诸多的xxxAutoConfiguration 其实就是Spring容器的JavaConfig形式,它的作用就是为Spring容器导入bean。

步骤二:自动配置生效

前面加载的所有自动配置类并不是都生效的,每一个xxxAutoConfiguration自动配置类都是在某些特定的条件之下才会生效。这些条件限制是通过@ConditionOnxxx注解实现的。

常见的@@ConditionOnxxx注解有以下几种:

@ConditionalOnBean:当容器里存在指定bean的条件下。@ConditionalOnMissingBean:当容器里不存在指定bean的条件下。@ConditionalOnClass:当类路径下有指定类的条件下。@ConditionalOnMissingClass:当类路径下不存在指定类的条件下。@ConditionalOnProperty:指定的属性是否有指定的值,比如@ConditionalOnProperties(prefix=”xxx.xxx”, value=”enable”, matchIfMissing=true),代表当xxx.xxx为enable时条件的布尔值为true,如果没有设置的情况下也为true。

@ConditionOnxxx注解用来指定自动配置类在哪些条件下会生效。我们要使用哪些类,就直接在spring boot项目中的pom.xml文件中导入相应的启动器即可,这样spring boot就会利用@ConditionOnxxx注解使我们需要的自动配置类生效,将该类的bean注入到spring容器中,这样就完成了整个自动配置的过程。

总结

spring boot中,每一个xxxAutoConfiguration 自动配置类,其实就是一个spring容器的JavaConfig形式,它的作用就是为spring容器注入相应的bean。而在注入bean的过程中,所有需要的属性值则是通过xxxProperties的bean来获得的。

拓展:xxxProperties类

或者问:在spring boot中,全局配置文件application.yaml或application.properties中自定义的属性如何产生作用?

在每一个xxxAutoConfiguration 类上都有一个@EnableConfigurationProperties(xxxProperties.class)注解,该注解表示开启配置属性,它的参数是一个xxxProperties类。

而xxxProperties类上又有一个@ConfigurationProperties(prefix = “xxx”)注解,该注解的作用就是从配置文件中绑定属性到对应的bean上,该注解的参数prefix 关键字定义的属性就是我们可以在全局配置文件application.yaml中自定义的属性。

举个栗子:假设在application.properties文件中,定义server.port=8081。

首先会找到根据prefix="server"找到对应的ServerProperties类,可以看到该类中定义了一个port属性,所以我们才可以在application.properties文件中自定义server.port属性。

接着@ConfigurationProperties起作用,将我们自定义的属性绑定到对应的bean上

然后@EnableConfigurationProperties注解将已经绑定新属性的bean注入到spring 容器中,这样开发人员自定义的属性就能起作用了。

总结:在全局配置的属性,如server.port=8081等,通过@ConfigurationProperties注解的prefix关键字将自定义的属性绑定到对应的xxxProperties实体类的bean上,然后通过@EnableConfigurationProperties注解将这个绑定了自定义属性的bean注入到spring容器中。

Spring Boot面试必问:自动配置原理相关推荐

  1. Spring Boot 面试杀手锏:自动配置原理

    欢迎关注方志朋的博客,回复"666"获面试宝典 不论在工作中,亦或是求职面试,Spring Boot已经成为我们必知必会的技能项.除了某些老旧的政府项目或金融项目持有观望态度外,如 ...

  2. Spring Boot面试必问:启动流程

    一 面试提问 1.1 Spring Boot启动流程

  3. springboot 获取配置文件中的值_Spring Boot面试必问(亲测)

    springboot面试大概率会问到的问题:什么是Spring Boot?Spring Boot与Spring cloud的区别Spring Boot有哪些特性Spring Boot配置文件的优先级 ...

  4. spring boot 核心_SpringBoot 核心技术 — 自动配置

    SpringBoot 能实现快速开发和部署的需求,越来越流行. 约定优于配置 SpringBoot 重要概念之一 约定优配置.这是一种开发模式吧,按照行业的规则,规定,减少不必要的开发. 如: 驼峰规 ...

  5. springboot生成包含特定数字_面试必问 —— Spring Boot 是如何实现自动配置的?

    什么是@Conditional? AutoConfigure源码分析 自动配置类中的条件注解 <Netty 实现原理与源码解析 -- 精品合集> <Spring 实现原理与源码解析 ...

  6. Spring Boot是如何实现自动配置的?

    原文:sylvanassun.github.io/2018/01/08/2018-01-08-spring_boot_auto_configure/ Spring Boot 是 Spring 旗下众多 ...

  7. Spring Boot(03)——自动配置

    Spring Boot 自动配置 Spring Boot的自动配置功能会根据Classpath中的Class为我们自动创建相应的bean.比如当classpath下存在MongoClient.clas ...

  8. 『图解Java并发』面试必问的CAS原理你会了吗?

    在并发编程中我们都知道i++操作是非线程安全的,这是因为 i++操作不是原子操作. 如何保证原子性呢?常用的方法就是加锁.在Java语言中可以使用 Synchronized和CAS实现加锁效果. Sy ...

  9. 稀疏多项式的运算用链表_用最简单的大白话聊一聊面试必问的HashMap原理和部分源码解析...

    HashMap在面试中经常会被问到,一定会问到它的存储结构和实现原理,甚至可能还会问到一些源码 今天就来看一下HashMap 首先得看一下HashMap的存储结构和底层实现原理 如上图所示,HashM ...

最新文章

  1. OpenCV 4.5.4 刚刚发布!新增SoftNMS、DNN模型8位量化等功能
  2. python 调试 cyberbrain 教程
  3. python---简单的接口测试实例
  4. asp.net中获取当前url的方法
  5. 机器学习笔试题精选(七)
  6. Kettle使用_0 Windows下安装图解
  7. Linux中常用的操作指令(随时更新)
  8. 【深搜】骑士游历(ssl 1277)
  9. JDBC简单连接MySQL
  10. 95-10-130-启动-TransactionCoordinator
  11. 注册测绘师学习笔记7
  12. 渗透测试方法论、流程 及NMAP简介
  13. R语言、Meta分析、MATLAB在生态环境领域里的应用
  14. CSS 的 hsl() 和 hsla() 函数(设置颜色的方式之一)
  15. Intro.js 简介和用法
  16. Python爬虫初学(3)登陆武汉理工大学教务处
  17. 数字电路为什么是低电平有效的多
  18. python电影名称词云_python wordcloud 对电影《我不是潘金莲》制作词云
  19. 为何要开办《微积分阅览室》?
  20. 十进制如何转化成二进制c语言,c语言怎么将十进制转化成二进制

热门文章

  1. 《炬丰科技-半导体工艺》化学蚀刻的铜-ETP铜
  2. JAVA中 什么是方法签名?what is method signature in java
  3. 利用云端GPU训练YOLOv5模型
  4. static定义静态方法
  5. IJCAI 2022 | 基于自适应虚词增强的小样本逆关系分类
  6. 深度学习100问-13:深度学习如何制作个人数据集?
  7. c语言中sin67 怎么表示,sin68°sin67°-sin23°cos68°的值为( )A.-22B.22C.32D.1 - 作业在线问答...
  8. 行驶证识别sdk的功能
  9. Mybatis从入门到精通二(入门详解)
  10. python里load什么意思_如何从python中执行LOAD DATA命令