问题:Spring 和 Spring Boot 有什么区别?
参考答案:作为 Java 开发人员对 Spring 框架都很熟悉,Spring 为 Java 程序提供了全面的基础架构支持,包含了很多非常实用的功能,如 Spring JDBC、Spring AOP、Spring ORM、Spring Test 等,这些模块的出现,大大的缩短了应用程序的开发时间,同时提高了应用开发的效率。
Spring Boot 本质上是 Spring 框架的延伸和扩展,它的诞生是为了简化 Spring 框架初始搭建以及开发的过程,使用它可以不再依赖 Spring 应用程序中的 XML 配置,为更快、更高效的开发 Spring 提供更加有力的支持。
问题:Spring Boot 有什么优点?
参考答案:Spring Boot 具有以下特点:
- 开发变得简单:提供一键式项目创建和快速集成各种依赖功能;
- 配置变得简单:提供了丰富的 Starters,集成主流开源产品往往只需要简单的配置即可;
- 部署变得简单:其本身内嵌启动容器,仅仅需要一个命令即可启动项目,结合 Jenkins、Docker 自动化运维非常容易实现;
- 监控变得简单:提供了监控组件,使用 Actuator 轻松监控服务各项状态。
问题:说一下 Spring Boot 启动流程?
参考答案:Spring Boot 启动流程要从 main 方法的 run 源码说起,它的源码如下:
public ConfigurableApplicationContext run(String… args) {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
ConfigurableApplicationContext context = null;
Collection
this.configureHeadlessProperty();
SpringApplicationRunListeners listeners = this.getRunListeners(args);
listeners.starting();
Collection exceptionReporters;
try {
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
ConfigurableEnvironment environment = this.prepareEnvironment(listeners, applicationArguments);
this.configureIgnoreBeanInfo(environment);
Banner printedBanner = this.printBanner(environment);
context = this.createApplicationContext();
exceptionReporters = this.getSpringFactoriesInstances(SpringBootExceptionReporter.class, new Class[]{ConfigurableApplicationContext.class}, context);
this.prepareContext(context, environment, listeners, applicationArguments, printedBanner);
this.refreshContext(context);
this.afterRefresh(context, applicationArguments);
stopWatch.stop();
if (this.logStartupInfo) {
(new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(), stopWatch);
}
listeners.started(context);
this.callRunners(context, applicationArguments);
} catch (Throwable var10) {
this.handleRunFailure(context, var10, exceptionReporters, listeners);
throw new IllegalStateException(var10);
}
try {
listeners.running(context);
return context;
} catch (Throwable var9) {
this.handleRunFailure(context, var9, exceptionReporters, (SpringApplicationRunListeners)null);
throw new IllegalStateException(var9);
}
}
从以上源码可以看出 Spring Boot 的启动总共分为以下 18 个步骤。
1.创建并启动计时监控类
此计时器是为了监控并记录 Spring Boot 应用启动的时间的,它会记录当前任务的名称,然后开启计时器。
2.声明应用上下文对象和异常报告集合
此过程声明了应用上下文对象和一个异常报告的 ArrayList 集合。
3.设置系统属性 headless 的值
设置 Java.awt.headless = true,其中awt(Abstract Window Toolkit)的含义是抽象窗口工具集。设置为 true表示运行一个 headless 服务器,可以用它来作一些简单的图像处理。
4.创建所有 Spring 运行监听器并发布应用启动事件
此过程用于获取配置的监听器名称并实例化所有的类。
5.初始化默认应用的参数类
也就是说声明并创建一个应用参数对象。
6.准备环境
创建配置并且绑定环境(通过 property sources 和 profiles 等配置文件)。
7.创建 Banner 的打印类
Spring Boot 启动时会打印 Banner 图片,如下图所示:
此 banner 信息是在 SpringBootBanner 类中定义的,我们可以通过实现 Banner 接口来自定义 banner 信息,然后通过代码 setBanner() 方法设置 Spring Boot 项目使用自己自定义 Banner 信息,或者是在 resources 下添加一个 banner.txt,把 banner 信息添加到此文件中,就可以实现自定义 banner 的功能了。
8.创建应用上下文
根据不同的应用类型来创建不同的 ApplicationContext上下文对象。
9.实例化异常报告器
它调用的是 getSpringFactoriesInstances() 方法来获取配置异常类的名称,并实例化所有的异常处理类。
10.准备应用上下文
此方法的主要作用是把上面已经创建好的对象,传递给 prepareContext 来准备上下文,例如将环境变量 environment 对象绑定到上下文中、配置 bean 生成器以及资源加载器、记录启动日志等操作。
11.刷新应用上下文
此方法用于解析配置文件,加载 bean 对象,并且启动内置的 web 容器等操作。
12.应用上下文刷新之后的事件处理
这个方法的源码是空的,可以做一些自定义的后置处理操作。
13.停止计时监控类
停止此过程第一步中的程序计时器,并统计任务的执行信息。
14.输出日志信息
把相关的记录信息,如类名、时间等信息进行控制台输出。
15.发布应用上下文启动完成事件
触发所有 SpringApplicationRunListener 监听器的 started 事件方法。
16.执行所有 Runner 运行器
执行所有的 ApplicationRunner 和 CommandLineRunner 运行器。
17.发布应用上下文就绪事件
触发所有的 SpringApplicationRunListener 监听器的 running 事件。
18.返回应用上下文对象
到此为止 SpringBoot 的启动程序就结束了,我们就可以正常来使用 Spring Boot 框架了。
问题:Spring 常用注解有哪些?
参考答案:Spring 常用注解包含以下这些。
问题:Ant、Maven 和 Gradle 有什么区别?
参考答案:Ant、Maven、Gradle 是 Java 领域中主要有三大构建工具,它们的区别如下:
- Ant(AnotherNeatTool)诞生于 2000 年,是由 Java 编写,采用 XML 作为构建脚本,这样就允许你在任何环境下运行构建。Ant 是 Java 领域最早的构建工具,不过因为操作复杂,慢慢的已经被淘汰了;
- Maven 诞生于 2004 年,目的是解决程序员使用 Ant 所带来的一些问题,它的好处在于可以将项目过程规范化、自动化、高效化以及强大的可扩展性;
- Gradle 诞生于 2009 年,是一个基于 Apache Ant 和 Apache Maven 概念的项目自动化建构工具。它使用一种基于 Groovy 的特定领域语言来声明项目设置,而不是传统的 XML。结合了前两者的优点,在此基础之上做了很多改进,它具有 Ant 的强大和灵活,又有 Maven 的生命周期管理且易于使用。
Spring Boot 官方支持 Maven 和 Gradle 作为项目构建工具。Gradle 虽然有更好的理念,但是相比 Maven 来讲其行业使用率偏低。
问题:properties 和 yml 有什么区别?
参考答案:properties 和 yml 都是 Spring Boot 支持的两种配置文件,其中 yml 格式的配置文件可以看作是对 properties 配置文件的升级。它们的主要区别有 4 点:
- 定义和定位不同:properties 翻译成中文是“属性”的意思,properties 只是用来设置一些属性配置的;yml 是 YAML 是缩写,它的全称 Yet Another Markup Language,翻译成中文是“另一种标记语言”。它的定位是“另一种标记语言”,所以从格局上来讲 yml 就甩 properties 好几条街;
- 语法不同:yml 的语法更简单,且可读性更高;
- 支持数据类型不同:yml 可以更好的配置多种数据类型,比如对象、集合等;
- 跨语言不同:yml 可以跨语言使用,通用性更好。
问题:SpringBoot 如何读取配置文件?
参考答案:在 Spring Boot 中读取配置文件有以下 5 种方法:
- 使用 @Value 读取配置文件。
- 使用 @ConfigurationProperties 读取配置文件。
- 使用 @PropertySource 读取配置文件。
- 使用 Environment 读取配置文件。
- 使用原生方式读取配置文件。
其中最常用的是前 3 种,如果读取某一个配置项可使用 @Value,如果读取一组配置项可使用 @ConfigurationProperties,如果要指定读取某一个具体的配置文件可使用 @PropertySource 来指定。
问题:配置文件中中文乱码问题如何处理?
参考答案:配置文件中的中文乱码问题的解决方案如下:
- 将配置文件的编码格式设置为支持中文的 UTF-8 格式;
- 使用 @PropertySource 设置支持中文的 UTF-8 格式读取,如 @PropertySource(value = “dev.properties”, encoding = “utf-8”)。