JAVA面试题锦集-Spring(SpringBoot)
摘要:
SpringBoot是Spring组件一站式解决方案,极大简化了Spring框架的使用难度,省去繁琐的配置,提供便捷的启动器,使开发者能快速上手。SpringBoot技术应用是基于Spring框架的,所以天然的拥有庞大的优良技术种群,并提供了一系列大型项目通用的非业务性功能组件,如:内嵌服务器、安全管理、运行数据监控、运行状况检查和外部化配置等
Spring Boot是什么
Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了Spring框架的使用难度,省去了繁琐的配置,提供了便捷的启动器,开发者能快速上手。
为什么要用 Spring Boot?
Spring的优点就不说了,SpringBoot的优点也非常多,下边列出来:
独立运行:内嵌服务器,一个服务器只服务于一个程序,契合微服务理念;
开箱即用:免去繁琐的XML配置,无需额外的代码生成;
版本统一:借助Maven等版本管理工具,对组件版本进行统一规范,避免了很多版本冲突问题;
功能强大:提供了一系列大型项目通用的非业务性功能组件,例如:内嵌服务器、安全管理、运行数据监控、运行状况检查和外部化配置等;
组件丰富:SpringBoot技术应用是基于Spring框架的,所以天然的拥有庞大的优良技术种群,可以非常简单的集成各种主流框架;
上手容易:非常贴切的诠释开箱即用,避免繁琐的配置,提供简洁的开发范式,只要用过,都会深有体会。
什么是 JavaConfig?
Spring JavaConfig 是 Spring 社区提供的一个产品,它可以帮助我们实现配置 Spring IoC 容器的纯Java 方法,从而避免使用 XML 配置。
使用 JavaConfig 的优点在于:
(1)面向对象的配置。由于配置被定义为 JavaConfig 中的类,因此用户可以充分利用 Java 中的面向对象功能。一个配置类可以继承另一个,重写它的@Bean 方法等。
(2)减少或消除 XML 配置。基于依赖注入的配置方式的好处已被证明。但是,许多开发人员不希望在XML 和 Java 之间来回切换。JavaConfig 便是为开发人员提供了一种纯 Java方法来配置与 XML 同样工作效果的 Spring 容器。从技术角度来讲,只使用 JavaConfig 配置类来配置容器是非常可行的,实际上也有很多人认为JavaConfig 与 XML 组合使用的匹配方式是最理想的。
(3)类型安全和重构友好。JavaConfig 提供了一种类型安全的方法来配置 Spring容器。由于 Java 5.0 以后对泛型的支持,现在我们可以按类型而不是按名称检索 bean,不需要任何强制转换或基于字符串的查找。
Spring Boot 是否可以使用 XML 配置 ?
Spring Boot 推荐使用纯 Java 方式配置而非 XML 方式,但是 Spring Boot 中也可以使用 XML 配置,通过 @ImportResource 注解即可引入一个 XML 配置。
Spring Boot 的核心配置文件有哪几个?它们的区别是什么?
Spring Boot 的核心配置文件是 application 和 bootstrap 配置文件。
其中application 配置文件是Spring Boot基本的配置文件,主要用于项目的自动化配置。
关于bootstrap,单纯做 Spring Boot 开发,可能不太容易遇到 bootstrap.properties 配置文件,但是在使用 Spring Cloud 方案时,这个配置就会经常遇到了,特别是在需要加载一些远程配置文件的时侯。bootstrap 配置文件使用场景相对特殊:
1.使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中需添加连接到配置中心的配置属性,来加载外部配置中心的配置信息;
2.一些固定的不能被覆盖的属性;
3.一些加密/解密的场景;
此外我们需要特别注意的是,boostrap 里面的属性不能被覆盖。
Spring Boot 的配置文件有哪几种格式?它们有什么区别?
.properties 和 .yml,它们的区别主要是书写格式不同。
a.properties
app.user.name = javastack
b.yml
app:
user:
name: javastack
不难看出.yml格式配置文件更能体现结构分层,可读性非常好,相对清晰。
此外,.yml配置的方式还支持有序,在特殊的场景下,配置内容加载有序可能会很关键;.yml方式还支持数组,且数组中的元素可以是基本数据类型也可以是对象。
出去这些,我们需要注意的是,.yml的配置不支持 @PropertySource 注解导入配置;此外还要留意.yml的缩进方式,比如多余的空格,都可能使配置属性失效。
Spring Boot 有哪几种读取配置的方式?
1,@Value注解读取方式
@Value("${db.username}")
private String username;
2,@ConfigurationProperties注解读取方式
@ConfigurationProperties(prefix = "db ")
3,读取指定文件
@PropertySource(value = { "config/db-config.properties" })
注意:@PropertySource不支持yml文件读取。
4,@PropertySource+@ConfigurationProperties组合式读取
@ConfigurationProperties(prefix = "db")
@PropertySource(value = { "config/db-config.properties" })
5,Environment读取方式
以上所有加载出来的配置都可以通过Environment注入获取到。
@Autowired
private Environment env;
Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
在Springboot项目中,启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合了以下3个注解:
@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能:
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
@ComponentScan:Spring组件扫描。
开启 Spring Boot 特性有哪几种方式?
- 继承spring-boot-starter-parent项目
2.导入spring-boot-dependencies项目依赖<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.6.RELEASE</version> </parent>
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>1.5.6.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencyManagement>
Spring Boot 需要独立的容器运行吗?
可以不需要,SpringBoot已经内置了 Tomcat/ Jetty 等容器。
运行 Spring Boot 有哪几种方式?
1.用命令直接运行或者放到容器中运行
2.用 Maven/ Gradle 插件运行
3.直接执行 main 方法运行
Spring Boot 自动配置原理是什么?
注解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass 就是自动配置的核心,首先它读取配置文件,然后根据配置路径去扫描这个类,实现自动配置。
如何理解 Spring Boot 中的 Starters?
Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成 Spring 及其他技术,而不需要到处找示例代码和依赖包,还可以省去各种版本冲突的麻烦。例如你想使用JPA技术访问数据库,只要加入 spring-boot-starter-data-jpa 启动器依赖就能使用了。
如何在 Spring Boot 启动的时候运行一些特定的代码?
如果我们想在Spring Boot启动的时候运行一些特定的代码,可以实现接口 ApplicationRunner或 CommandLineRunner,这两个接口实现方式一样,它们都只提供了一个run方法。
关于启动顺序,如果涉及到多处启动,我们可以通过实现org.springframework.core.Ordered接口或者使用 org.springframework.core.annotation.Order注解,来控制它们的启动顺序。
Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个?
Spring Boot 支持 Java Util Logging, Log4j2, Lockback 作为日志框架,如果你使用 Starters 启动器,Spring Boot 将使用 Logback 作为默认日志框架。
SpringBoot 实现热部署有哪几种方式?
主要有两种方式:
1,Spring Loaded
2,Spring-boot-devtools
在Spring Boot实现代码热部署是一件很简单的事情,通过简单的依赖引入,即可实现在代码修改时自动部署并重新热启动项目。