49

面试被问为什么使用 Spring Boot?答案好像没那么简单

 4 years ago
source link: https://mp.weixin.qq.com/s/UFuBVe-uyO4jlwZP3bmSVA
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

公众号[ 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文件中使用<import/>导入,查看EnableAutoConfigurationImportSelector源码会发现它就是用于处理@EnableAutoConfiguration注解的,不过在Spring Boot1.5版本开始被标记为弃用,使用AutoConfigurationImportSelector代替,也就是它的父类,在这个类中将在classpath下jar包中META-INF目录下搜索spring.factories文件,然后在spring.factories文件中查找以org.springframework.boot.autoconfigure.EnableAutoConfiguration为key的值,值是一个列表,列表中记录的是需要进行自动化配置的类会被执行,例如AopAutoConfiguration会自动配置Aop相关配置,使用JDK代理还是CGLIB代理。

面试官 :那这个自动化配置是如何触发的?

小小白 :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文件可以省略依赖库的<version>标签,例如添加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框架内置了哪些可扩展接口,咱们一个一个聊

Spring声明式事务处理的实现原理,来自面试官的穷追拷问

Spring MVC相关面试题就是无底洞,反正我是怕了

说实话,面试这么问Spring框架的问题,我快扛不住了

没使用加号拼接字符串,面试官竟然问我为什么

面试官一步一步的套路你,为什么SimpleDateFormat不是线程安全的

都说ThreadLocal被面试官问烂了,可为什么面试官还是喜欢继续问

Java注解是如何玩转的,面试官和我聊了半个小时

如何去除代码中的多次if而引发的一连串面试问题

String引发的提问,我差点跪了

就写了一行代码,被问了这么多问题

面试官:JVM对锁进行了优化,都优化了啥?

synchronized连环问

MfUNZvm.jpg!web

支持原创,我点【 在看  


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK