公众号[ JavaQ ]原创,专注分享 Java 基础原理分析、实战技术、微服务架构、分布式系统构建,诚邀点赞关注!
面试官 :项目中有使用Spring Boot吗?
小小白 :用过。
面试官 :说一下为什么要使用Spring Boot?
小小白 :在使用Spring框架进行开发的过程中,需要配置很多Spring框架包的依赖,如spring-core、spring-bean、spring-context等,而这些配置通常都是重复添加的,而且需要做很多框架使用及环境参数的重复配置,如开启注解、配置日志等。Spring Boot致力于弱化这些不必要的操作,提供默认配置,当然这些默认配置是可以按需修改的,快速搭建、开发和运行Spring应用。
面试官 :有人说Spring Boot是微服务的框架,你认为是吗?
小小白 :Spring Boot是Spring家族的成员,它是一个全新的框架,它的设计目的是尽可能简单和快速的开发、运行Spring应用程序,简化配置。它为开发者快捷的使用Spring及相关开发框架提供了便利,但是它并不是微服务的框架,它只是为微服务框架的使用也提供了很好的脚手架。
面试官 :Spring Boot中的Starter是什么?
小小白 :Spring Boot中的Starter是一个包含很多依赖描述的集合,只要添加一个Starter,这个Starter里面约定的依赖都会被添加到项目中,例如代码添加了spring-boot-starter-web,执行maven操作就会下载web应用需要的依赖jar。开发者通过使用这些Starter可以快速的搭建开发环境,自动加载所需要的依赖和配置参数属性。
面试官 :你刚刚说到使用Spring Boot快速搭建开发环境,是不是需要从无到有手动搭建?
小小白 :如果想快速搭建项目开发环境,可以通过Spring Initializr[http://start.spring.io/]引导快速构建项目。最近阿里也开源了Aliyun Java Initializr[https://start.aliyun.com/],也可以通过它的引导快速构建Java项目。
面试官 :Spring Boot中@EnableAutoConfiguration注解有什么作用?
小小白 :@EnableAutoConfiguration注解从字面上理解是开启自动配置,在@EnableAutoConfiguration注解的定义中使用了@Import注解,使用@Import导入EnableAutoConfigurationImportSelector.class,作用等同于在Spring的xml文件中使用
面试官 :那这个自动化配置是如何触发的?
小小白 :ConfigurationClassPostProcessor类的postProcessBeanFactory方法中调用了ConfigurationClassParser类的parse方法,而ConfigurationClassParser类的parse方法间接调用了AutoConfigurationImportSelector类。这个ConfigurationClassPostProcessor实现了BeanDefinitionRegistryPostProcessor接口,而BeanDefinitionRegistryPostProcessor继承了BeanFactoryPostProcessor接口,熟悉Spring原理的都知道BeanFactoryPostProcessor接口中的postProcessBeanFactory方法会在Spring容器加载bean的定义文件之后,在bean实例化之前执行,而这一步是由SpringApplication的run方法触发的,在这个run方法中实现了Spring容器的启动及初始化。
面试官 :有些开发者会在pom.xml中继承spring-boot-starter-parent,这样做有什么好处?
小小白 :通过继承的方式可以很方便的进行依赖版本管理,使用默认的依赖版本,当然也可以更改这些依赖的版本号。继承spring-boot-starter-parent可以获取以下默认特性:
-
默认使用Java1.6进行编译;
-
默认代码编码为UTF-8;
-
新建项目的pom文件可以省略依赖库的
标签,例如添加activemq依赖的时候,可以不写版本号; -
恰到好处的资源过滤;
-
恰到好处的插件配置,如exec插件;
-
恰到好处的对application.properties和application.yml进行筛选。
面试官 :Spring Boot中如何实现对不同环境的属性配置文件的支持?
小小白 :Spring-Boot支持不同环境的属性配置文件切换,通过创建application-{profile}.properties文件,其中{profile}是具体的环境标识名称,例如:application-dev.properties用于开发环境,application-test.properties用于测试环境,application-uat.properties用于uat环境。如果要想使用application-dev.properties文件,则在application.properties文件中添加spring.profiles.active=dev;如果要想使用application-test.properties文件,则在application.properties文件中添加spring.profiles.active=test。
面试官 :这样会有一个问题,不可能每次打包部署都手动修改application.properties中spring.profiles.active的值,这个问题如何解决?
小小白 :一般的做法是在项目路径下建立以环境标识名称为名的目录,然后每个目录下添加各自环境的application.properties属性配置,在自动打包部署的时候将对应的application.properties拷贝到classpath下,这样就实现了配置文件切换。
面试官 :Spring Boot会自动加载哪些路径下的application.properties?
小小白 :Spring Boot支持从以下位置加载application.properties文件:当前目录下的/config子目录、当前目录、classpath下的/config包、classpath根路径。
面试官 :如果这四个路径的application.properties文件中配置了某属性,最终生效的是哪个文件里的?
小小白 :最终生效的是当前目录下的/config子目录下的application.properties中的配置,覆盖顺序是当前目录下的/config子目录覆盖当前目录,当前目录覆盖classpath下的/config包,classpath下的/config包覆盖classpath根路径。
面试官 :@SpringBootApplication注解有什么作用?
小小白 :从@SpringBootApplication注解源码可以看到它具有@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan三个注解的作用。@SpringBootConfiguration注解用于标注Spring应用引导类,在应用启动的时候这个引导类会被执行;@EnableAutoConfiguration注解用于根据依赖自动开启一些配置;@ComponentScan注解用于配置哪些基础包或类被自动扫描。
往期推荐 :
面试官:Spring框架内置了哪些可扩展接口,咱们一个一个聊
面试官一步一步的套路你,为什么SimpleDateFormat不是线程安全的
都说ThreadLocal被面试官问烂了,可为什么面试官还是喜欢继续问
支持原创,我点【 在看 】
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 硅谷的反思:我们好像制造了一个怪物
- 一个困扰我 122 天的技术问题,我好像知道答案了
- leetcode243. 最短单词距离(vip题)好像挺简单?
- 最新编程语言排行榜出炉:Swift和Kotlin好像开始凉了
- Python面试经验总结,面试一时爽,一直面试一直爽!
- 算法面试:数组编码面试问题
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。