场景:今天去面试,聊到spring-boot-starter几个连环问,把我问蒙了。
面试官:springBoot有什么优点?
我:springBoot省去了大量的xml配置,之前自己配置pom文件时可能会出现版本冲突问题,springBoot帮我们直接封装成Starter帮我们处理了版本冲突问题(完了,面试官抓住这点不放了,一直问依赖问题)
面试官:springBoot是怎么处理版本冲突问题?
我:(有点懵逼了之前没有了解过,我之前看maven配置的时候记得,有一个约定大于配置这个说法,还有一个叫就近原则)利用就近原则处理版本冲突
面试官:我如果在项目中两个不同的版本的包会冲突?
我:版本不一样不冲突(懵逼心里没底)
面试官:你能不能自己做一个Starter,公司用的时候可以直接调用?
我:我没做过,可以打个jar包(懵逼心里没底,我只在公司项目中里见过公司封装的Starter当时没有仔细了解)
===================================================================================================================================================================
参考这位博友:https://blog.csdn.net/weixin_48182198/article/details/114367178
面试题一:springBoot如何处理版本依赖的呢?
什么是依赖冲突(maven知识)
场景:
spring-webmvc、spring-jdbc 都依赖 spring-beans
spring-webmvc 的版本是5.2.8,那么它依赖的 spring-beans 的版本也是5.2.8
spring-jdbc 的版本是5.2.6,那么它依赖的 spring-beans 的版本也是5.2.6
如果 spring-jdbc 和 spring-webmvc 放到一起,那么就会出现两个版本的 spring-beans ,这样就产生了依赖冲突,那么就需要想办法只保留一个版本的 spring-beans
依赖冲突的解决方案
-
方案一:默认情况下,优先保留前面先声明的版本
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
方案二:单独为依赖库添加 dependency 指定版本
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
此时spring-Beans使用的就是5.2.6.RELEASE版本了
方案三:利用exclusions排除冲突版本
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.8.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
方案四:使用 dependencyManagement 锁定依赖库的版本号(注意: dependencyManagement 只是声明版本号,并不会触发下载依赖导入依赖库)
<properties>
<!-- 定义版本号 -->
<spring.version>5.2.8.RELEASE</spring.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
</dependencies>
面试二:springBoot中yml文件中怎么配置数组?(这个当时没有记住)
两种写法
第一种 - 后面跟字符串(字符串加引号,字符串和字符串之间没有逗号分隔)
第二种:行内法就是写在同一行(冒号后面必须空格)在中括号[]字符串内写字符串(面试的时候我写成{}太很水啦)
phone:
- "小米"
- "华为"
- "苹果"
phone1: ["小米","华为","苹果"]
面试三:利用@Value和@ConfigurationProperty的区别及字母大小写的问题?
student:
name: "张三"
age: 20
school: "清华大学"
此时我用@Value和@ConfigurationProperty用如下方式读取是否可以读到
第一种小写读取
name
age
school
第二种大写
NAME
AGE
SCHOOL
@Value不能读取到启动直接报错
@ConfigurationProperty 可以不区分大小写
我当时回答的是两种方式读取小写时肯定都是可以的(配置什么读什么肯定是没有问题的)但是配置文件用小写配置用大写读的话我就很懵逼了(没有这样用过)