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

1、什么是Spring Boot?

Spring Boot是spring的脚手架,使用Spring Boot可以做到专注于Spring应用的开发,而无需过多关注XML的配置。能够使开发者在极短的时间内开发出单个微服务。Spring Boot使用“习惯优于配置”的理念,简单来说,它提供了一堆依赖打包,并已经按照使用习惯解决了依赖问题。使用Spring Boot可以不用或者只需要很少的Spring配置就可以让企业项目快速运行起来。

Spring Boot的核心功能:

  • 可独立运行的Spring项目:Spring Boot可以以jar包的形式独立运行。
  • 内嵌的Servlet容器:Spring Boot可以选择内嵌Tomcat、Jetty或者Undertow,无须以war包形式部署项目。
  • 简化的Maven配置:Spring提供推荐的基础 POM 文件来简化Maven 配置。
  • 自动配置Spring:Spring Boot会根据项目依赖来自动配置Spring 框架,极大地减少项目要使用的配置。
  • 提供生产就绪型功能:提供可以直接在生产环境中使用的功能,如性能指标、应用信息和应用健康检查。
  • 无代码生成和xml配置:Spring Boot不生成代码。完全不需要任何xml配置即可实现Spring的所有配置。

2、Spring Boot与Spring cloud的区别

  • Spring boot是Spring的一套快速配置脚手架,可以基于Spring Boot快速开发单个微服务;Spring Cloud是一个基于Spring Boot实现的云应用开发工具
  • Spring Boot专注于快速、方便集成的单个个体,Spring Cloud是关注全局的服务治理框架;
  • Spring boot使用了默认大于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置,Spring Cloud很大的一部分是基于Spring Boot来实现。
  • Spring Boot可以离开Spring Cloud独立使用开发项目,但是Spring Cloud离不开Spring Boot,属于依赖的关系。

3、Spring Boot有哪些特性

这个问题就很容易被问到了,Spring Boot主要有两大特性,分别是:起步依赖自动装配,接下来就仔细说一下:

起步依赖:
每一个Spring Boot项目都必须继承依赖:spring-boot-starter-parent,而点进这个依赖能看到,它又继承了spring-boot-dependencies依赖,如下图:

而在spring-boot-dependencies的pom文件中,有大量的依赖,以及定义好的每个依赖的版本号,这里的版本号,是根据springboot的版本号而定义的,不同版本的springboot版本,各个依赖的版本号也不一致的:

这里即解决了我们原有项目中可能存在依赖版本冲突的问题,它来真正管理spring boot应用里面的所有依赖版本。

除了继承父依赖之外,我们的项目还需要引入spring-boot-starter-web依赖,它帮我们导入了web模块正常运行所依赖的组件,这些依赖的版本则由父项目进行管理。而这个里面也引用了tomcat的依赖,我们可以通过自动装配的tomcat端口启动项目。

总结:
在起步依赖上,spring boot帮我们管理了各个依赖的版本,使各个依赖不会出现版本冲突;另外,帮我们打包了各个依赖让我们不用再像之前那样自己导入一大堆的依赖,只要引入起步依赖的坐标就可以进行web开发了,同样体现了依赖传递的用。

自动装配:
自动装配也是spring boot的一大特性,新建spring boot项目之后,会发现在启动类上有个@SpringBootApplication注解,而springboot也是通过该注解去自动装配的,点进去@SpringBootApplication注解可看到如下内容:

可以看到,@SpringBootApplication注解可以算是由三个注解组成的,@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan。由这三个注解组成,@ComponentScan就很熟悉啦,就是用来配置spring容器扫描路径的,默认指扫描当前启动类所在的包里的对象,如果你想在本服务使用其他服务的类,可以在@SpringBootApplication注解后面添加(scanBasePackages = {"其他服务包路径:如com.aaa.bbb", "本服务包路径"}),接下来看下@SpringBootConfiguration注解:

这里面啥都没有,其实@SpringBootConfiguration注解就等同于@Configuration注解,而@Configuration注解也很熟悉啦,使用注解@Configuration的类,就表示这个类是SpringBoot bean的创建的配置文件类。启动类标注了@SpringBootConfiguration之后,本身其实也是一个ioc容器的配置类。

最终要的是@EnableAutoConfiguration这个注解,这个注解是SpringBoot自动配置功能开启,是自动装配的核心注解,点进去看下:

可以看到,@EnableAutoConfiguration这个注解使用了@AutoConfigurationPackage注解,还导入了一个AutoConfigurationImportSelector的类,先来看下@AutoConfigurationPackage注解,这个注解其实就是导入了一个AutoConfigurationPackages.Registrar.class的组件,如下图:

可以看到这个类有两个方法,主要看第一个方法:registerBeanDefinitions,顾名思义,这个方法就是用来注册bean,register方法会扫描主配置类所在包及其子包下的组件,并注册到IOC容器中。这就是@AutoConfigurationPackage注解的作用。

接下来看下导入的AutoConfigurationImportSelector类是做什么的,我们只用关注getCandidateConfigurations()这个方法:

在方法第一行打个断点看一下:

可以看到,configurations里面,就是获取的全类名集合,那么这些配置类是在哪里扫描到的呢?看下下面的报错提示信息就知道了,可以看到是在META-INF/spring.factories文件内获取的,而这个文件,就在当前类所在的包:

看到这里,就比较清晰了,自动装配就是扫描到这些配置类,然后进行装配的。

来看下下面这个类是怎么装配的:

下面标记出来的这个注解就是装配配置文件:

点进去ServerProperties类看一下:

可以看到,这个类读取配置文件以server开头,比如server.port、server.address等,这些配置文件是在当前包下的spring-configuration-metadata.json里面:

点进去可以看到很多json数据:

搜索一下server.port、server.address:

通过这些json数据进行相应装配,比如server.port,其实就是tomcat默认的端口号,有个defaultValue,默认值就是8080。

总结:
自动配置,第一得益于能扫描主配置类所在包及其子包的组件,将这些组件注册到IOC容器中,第二它能借助spring框架原有的SpringFactoriesLoader的支持,加载META-INF/spring.factories获取组件的全类名并通过反射实例化为对应的标注了@Configuration的JavaConfig形式,并且符合要求@Conditional要求的IOC容器配置类,然后通过一些默认值来进行相应初始化配置。

4、Spring Boot配置文件的优先级

前面说了每个Spring Boot项目都要依赖于spring-boot-starter-parent,看下spring-boot-starter-parent的pom文件:

可以看到,这里就是加载配置文件的地方,配置文件可以以application开头,yml、yaml、properties结尾,加载顺序为yml -> yaml -> properties,后面的配置会覆盖前面的配置,比如本项目有个yml配置文件,还有个properties配置文件,两个配置文件内都有server.port,yml里面的值为8081,properties里面的值为8082,那么启动项目之后tomcat的端口就是8082,会覆盖掉yml里面的配置。

结尾

如果你觉得我的文章对你有帮助话,欢迎关注我的微信公众号:"一个快乐又痛苦的程序员"(无广告,单纯分享原创文章、已pj的实用工具、各种Java学习资源,期待与你共同进步)

springboot 获取配置文件中的值_Spring Boot面试必问(亲测)相关推荐

  1. Spring Boot面试必问:自动配置原理

    Spring Boot自动配置原理 在传统的SSM框架集成中,需要编写大量的XML配置文件,比如集成Mybatis时,需要编写mybatis_config.xml文件,在集成springmvc时,需要 ...

  2. Springboot @Value获取配置文件中的值失效

    自动注入失效有以下两种可能 1. 包没有被扫描到 定义一个扫描组件有两种方式: 如果你正在使用springboot,那么 如果你需要扫描的包的层级,在注有@SpringBootApplication的 ...

  3. 分布式系统中的CAP理论,面试必问,你理解了嘛?

    对于刚刚接触分布式系统的小伙伴们来说,一提起分布式系统,就感觉高大上,深不可测.而且看了很多书和视频还是一脸懵逼.这篇文章主要使用大白话的方式,带你理解一下分布式系统中的CAP理论.保证你能听懂. 为 ...

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

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

  5. vue获取div中的值_vue获取内存中的值并写入

    发表评论 发表评论 第{{i+1}}楼  匿名用户  发表时间:{{item.id|dateFormat}} {{item.content}} 加载更多 export default{ data(){ ...

  6. SpringBoot之获取配置文件中的数据

    SpringBoot之获取配置文件中的数据 项目结构 配置application.properties book.author=Tom book.name=SpringBoot # spring.pr ...

  7. Springboot加密配置文件中数据库密码的两种解决方案

    Springboot 加密配置文件中数据库密码的两种解决方案 第一种:jasypt 加解密 jasypt 是一个简单易用的加解密Java库,可以快速集成到 Spring Boot 项目中,并提供了自动 ...

  8. html读取model的值,Js和Thymeleaf如何获取model中的值

    简述 在大多数的项目架构中,使用SPringBoot发布微服务,前端采用Thymeleaf做为Html模版,使用Jquery做为动态脚本,那么Thymeleaf和Jquery是如何获取Model中的数 ...

  9. pandas获取dataframe中索引值最大值所在的数据行(get dataframe row of max index value)

    pandas获取dataframe中索引值最大值所在的数据行(get dataframe row of max index value) 目录 pandas获取dataframe中索引值最大值所在的数 ...

最新文章

  1. 数据结构1:单链表反转java代码解释
  2. C/C++开发游戏项目之《智能图形界面-贪吃蛇》
  3. python与网页设计的区别_Python与设计模式(三):行为型模式(上)
  4. 【HDU - 5876】Sparse Graph(补图bfs,STLset)
  5. 随机产生13个0~51不同的随机数 -思想(定义参考系)
  6. Linux内核提供了三种不同形式的中断底半部实现机制:软中断、tasklet和工作队列。...
  7. 终极邮件搜索群发大师 v3.47 绿色
  8. 【Pytorch官方教程】从零开始自己搭建RNN1 - 字母级RNN的生成任务
  9. dnf时装补丁教程_dnf时装补丁怎么用?DNF时装补丁教程
  10. java的pdf转永中_永中PDF转Word 免费转换不求人!
  11. 那个“天使”阿桑奇又回来了
  12. 本地音乐如何导入apple_如何将自己的音乐添加到Apple Music
  13. dispatch_once造成的死锁问题
  14. GIS制作色斑图(等值面图)保姆级指导0基础小白
  15. raster包—aggregate函数
  16. python将doc文件转换docx
  17. Redis缓存雪崩与解决方案
  18. 超级!超级!超级好用的视频标注工具
  19. win7计算机任务栏过长,win7电脑怎么调节任务栏的高度
  20. 公众号运营该如何快速找到内容方向定位?

热门文章

  1. 图的邻接矩阵存储和邻接表存储定义方法
  2. ACM入门之【二分】
  3. 1342. 断开的项链【难度: 一般 / 破环成链】
  4. 【PAT乙级】1083 是否存在相等的差 (20 分)
  5. Spring boot的Thymeleaf使用
  6. Synchronize锁粒度
  7. EF映射之DataBaseFirst
  8. linux 相册管理,图片管理(时间线、相册管理)- 深度看图 -Deepin深度系统用户手册...
  9. 【Java】5.2 方法详解
  10. python:sort,sorted,argsort,lexsort