SpringBoot面试题

目录

1、什么是 Spring Boot?

2、为什么要用 Spring Boot?

一、独立运行

二、简化配置

三、自动配置

四、无代码生成和XML配置

五、应用监控

3、Spring Boot 的核心配置文件有哪几个?它们的区别是什么?

 4、Spring Boot 的配置文件有哪几种格式?它们有什么区别?

5、Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?

6、开启 Spring Boot 特性有哪几种方式?

7、Spring Boot 需要独立的容器运行吗?

8、运行 Spring Boot 有哪几种方式?

9、Spring Boot 自动配置原理是什么?

10、Spring Boot 的目录结构是怎样的?

11、你如何理解 Spring Boot 中的 Starters?

12、如何在 Spring Boot 启动的时候运行一些特定的代码?

13、Spring Boot 有哪几种读取配置的方式?

14、Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个?

15、SpringBoot 实现热部署有哪几种方式?

16、你如何理解 Spring Boot 配置加载顺序?

17、Spring Boot 如何定义多套不同环境配置?

18、Spring Boot 可以兼容老 Spring 项目吗,如何做?

Spring Boot @ImportResource注释示例

19、Spring Boot 2.X 有什么新特性?与 1.X 有什么区别?


1、什么是 Spring Boot?

SpringBoot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。

2、为什么要用 Spring Boot?

Spring Boot 优点非常多,如:

一、独立运行

Spring Boot而且内嵌了各种servlet容器,Tomcat、Jetty等,现在不再需要打成war包部署到容器中,Spring Boot只要打成一个可执行的jar包就能独立运行,所有的依赖包都在一个jar包内。

二、简化配置

spring-boot-starter-web启动器自动依赖其他组件,简少了maven的配置。

SpringBoot面试题_第1张图片

三、自动配置

Spring Boot能根据当前类路径下的类、jar包来自动配置bean,如添加一个spring-boot-starter-web启动器就能拥有web的功能,无需其他配置。

四、无代码生成和XML配置

Spring Boot配置过程中无代码生成,也无需XML配置文件就能完成所有配置工作,这一切都是借助于条件注解完成的,这也是Spring4.x的核心功能之一。

五、应用监控

Spring Boot提供一系列端点可以监控服务及应用,做健康检测。

3、Spring Boot 的核心配置文件有哪几个?它们的区别是什么?

Spring Boot 中有以下两种配置文件:

(1)bootstrap (.yml 或者 .properties)

(2)application (.yml 或者 .properties)

bootstrap/ application 的区别:

Spring Cloud 构建于 Spring Boot 之上,在 Spring Boot 中有两种上下文,一种是 bootstrap,,另外一种是 application,,bootstrap 是应用程序的父上下文,也就是说 bootstrap 加载优先于 applicaton。bootstrap 主要用于从额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。这两个上下文共用一个环境,它是任何Spring应用程序的外部属性的来源。bootstrap 里面的属性会优先加载,它们默认也不能被本地相同配置覆盖。

因此,对比 application 配置文件,bootstrap 配置文件具有以下几个特性:

(1)boostrap 由父 ApplicationContext 加载,比 applicaton 优先加载

(2)boostrap 里面的属性不能被覆盖

 bootstrap/ application 的应用场景:

application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置。

bootstrap 配置文件有以下几个应用场景:

(1)使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;

(2)一些固定的不能被覆盖的属性

(3)一些加密/解密的场景。

 4、Spring Boot 的配置文件有哪几种格式?它们有什么区别?

.properties 和 .yml,它们的区别主要是书写格式不同。

  (1).properties

app.user.name = javastack

  (2).yml

app:
  user:
    name: javastack

另外,.yml 格式不支持 @PropertySource 注解导入配置。

5、Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?

 启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:

@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。

@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。

@ComponentScan:Spring组件扫描。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
		@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
 
	//自动注入的时候,排序的类
	@AliasFor(annotation = EnableAutoConfiguration.class)
	Class[] exclude() default {};
 
	//自动注入的时候,排序的类的名字
	@AliasFor(annotation = EnableAutoConfiguration.class)
	String[] excludeName() default {};
 
	//自动注入的时候,扫描的包路径	
	@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
	String[] scanBasePackages() default {};
 
	//自动注入的时候,扫描的类注解(@Service,@Controller等)
	@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
	Class[] scanBasePackageClasses() default {};
 
}

 注解

6、开启 Spring Boot 特性有哪几种方式?

有以下两种方式:

1. 继承spring-boot-starter-parent项目

  
    org.springframework.boot   
    spring-boot-starter-parent
    1.5.6.RELEASE

2. 导入spring-boot-dependencies项目依赖


    
        
            org.springframework.boot
            spring-boot-dependencies
            1.5.6.RELEASE
            pom
            import
        
    

Spring Boot依赖注意点:

1. 属性覆盖只对继承有效

Spring Boot依赖包里面的组件的版本都是和当前Spring Boot绑定的,如果要修改里面组件的版本,只需要添加如下属性覆盖即可,但这种方式只对继承有效,导入的方式无效。


    1.7.25

如果导入的方式要实现版本的升级,达到上面的效果,这样也可以做到,把要升级的组件依赖放到Spring Boot之前。

SpringBoot面试题_第2张图片

需要注意,要修改Spring Boot的依赖组件版本可能会造成不兼容的问题。

7、Spring Boot 需要独立的容器运行吗?

可以不需要,内置了 Tomcat/Jetty 等容器。

8、运行 Spring Boot 有哪几种方式?

(1)打包用命令或者放到容器中运行

(2)用 Maven/Gradle 插件运行

(3)直接执行 main 方法运行

9、Spring Boot 自动配置原理是什么?

Spring Boot的自动配置注解是@EnableAutoConfiguration, 从上面的@Import的类可以找到下面自动加载自动配置的映射。

10、Spring Boot 的目录结构是怎样的?

Spring Boot 与传统项目最大的区别是,传统项目都是打成 WAR 包部署到服务器上面,需要额外的 Servlet 容器, 而 Spring Boot 则可以直接打成 jar包,并内置集成了 Servlet 容器,通过命令 java -jar xx.jar 则可以直接运行,不需要独立的 Servlet 容器。

打成可执行 jar 包后,我们来看下其中的 META-INF/MANIFEST.MF 文件:

其中有一个 Start-Class 便是这个 jar 包的入口类,这个入口类推荐是放在一个项目的顶层包中,其他所有的类都放在其子包下面,目录结构如以下所示:

这个目录结构是主流及推荐的做法,而在主入口类上加上 @SpringBootApplication 注解来开启 Spring Boot 的各项能力,如自动配置、组件扫描等。

如果你不想这么做,你也可以充分利用 @EnableAutoConfiguration 和 @ComponentScan 注解自定义你的行为,不过这不是推荐的做法。

11、你如何理解 Spring Boot 中的 Starters?

Starters是什么:

Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成Spring及其他技术,而不需要到处找示例代码和依赖包。如你想使用Spring JPA访问数据库,只要加入spring-boot-starter-data-jpa启动器依赖就能使用了。Starters包含了许多项目中需要用到的依赖,它们能快速持续的运行,都是一系列得到支持的管理传递性依赖。

Starters命名:

Spring Boot官方的启动器都是以spring-boot-starter-命名的,代表了一个特定的应用类型。第三方的启动器不能以spring-boot开头命名,它们都被Spring Boot官方保留。一般一个第三方的应该这样命名,像mybatis的mybatis-spring-boot-starter。

Starters分类:

1. Spring Boot应用类启动器

2. Spring Boot生产启动器

3. Spring Boot技术类启动器

12、如何在 Spring Boot 启动的时候运行一些特定的代码?

如果你想在Spring Boot启动的时候运行一些特定的代码,你可以实现接口ApplicationRunner或者CommandLineRunner,这两个接口实现方式一样,它们都只提供了一个run方法。

CommandLineRunner:启动获取命令行参数

ApplicationRunner:启动获取应用启动的时候参数

使用方式:

或者这样

启动顺序:

如果启动的时候有多个ApplicationRunner和CommandLineRunner,想控制它们的启动顺序,可以实现 org.springframework.core.Ordered接口或者使用 org.springframework.core.annotation.Order注解。

13、Spring Boot 有哪几种读取配置的方式?

在application.yml或者properties文件中添加:

info.address=USA

info.company=Spring

info.degree=high

一、@Value注解读取方式:

二、@ConfigurationProperties注解读取方式:

 

读取指定文件:

资源目录下建立config/db-config.properties:

db.username=root

db.password=123456

一、@PropertySource+@Value注解读取方式:

注意:@PropertySource不支持yml文件读取。

二、@PropertySource+@ConfigurationProperties注解读取方式:

三、Environment读取方式:

以上所有加载出来的配置都可以通过Environment注入获取到:

总结

从以上示例来看,Spring Boot可以通过@PropertySource,@Value,@Environment,@ConfigurationProperties来绑定变量。

14、Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个?

Spring Boot支持Java Util Logging,Log4j2,Lockback作为日志框架,如果你使用starters启动器,Spring Boot将使用Logback作为默认日志框架。无论使用哪种日志框架,Spring Boot都支持配置将日志输出到控制台或者文件中。

spring-boot-starter启动器包含spring-boot-starter-logging启动器并集成了slf4j日志抽象及Logback日志框架。
 

15、SpringBoot 实现热部署有哪几种方式?

在Spring Boot实现代码热部署是一件很简单的事情,代码的修改可以自动部署并重新热启动项目。

一、引用devtools依赖:

这样,当修改一个java类时就会热更新。

二、自定义配置热部署:

以下配置用于自定义配置热部署,可以不设置。

三、Intellij Idea修改:

如果是idea,需要改以下两个地方:

1、勾上自动编译或者手动重新编译

File > Settings > Compiler-Build Project automatically

2、注册

ctrl + shift + alt + / > Registry > 勾选Compiler autoMake allow when app running
 

16、你如何理解 Spring Boot 配置加载顺序?

使用 Spring Boot 会涉及到各种各样的配置,如开发、测试、线上就至少 3 套配置信息了。Spring Boot 可以轻松的帮助我们使用相同的代码就能使开发、测试、线上环境使用不同的配置。

在 Spring Boot 里面,可以使用以下几种方式来加载配置:

1、properties文件;

2、YAML文件;

3、系统环境变量;

4、命令行参数;

17、Spring Boot 如何定义多套不同环境配置?

首先我们要了解一个名词:Profile

简单来说,Profile就是Spring Boot可以对不同环境或者指令来读取不同的配置文件。

假如有开发、测试、生产三个不同的环境,需要定义三个不同环境下的配置。

基于properties文件类型

你可以另外建立3个环境下的配置文件:

applcation.properties

application-dev.properties

application-test.properties

application-prod.properties

然后在applcation.properties文件中指定当前的环境spring.profiles.active=test,这时候读取的就是application-test.properties文件。

基于yml文件类型

只需要一个applcation.yml文件就能搞定,推荐此方式。

此时读取的就是prod的配置,prod包含proddb,prodmq,此时可以读取proddb,prodmq下的配置。

也可以同时激活三个配置。

基于Java代码

在JAVA配置代码中也可以加不同Profile下定义不同的配置文件,@Profile注解只能组合使用@Configuration和@Component注解。

指定Profile

main方法启动方式:

插件启动方式:

jar运行方式:

除了在配置文件和命令行中指定Profile,还可以在启动类中写死指定,通过SpringApplication.setAdditionalProfiles方法。

SpringApplication.class:

18、Spring Boot 可以兼容老 Spring 项目吗,如何做?

可以兼容,使用 @ImportResource 注解导入老 Spring 项目配置文件。

Spring Boot @ImportResource注释示例

  Spring提供了一个  @ImportResource  注释,用于将applicationContext.xml文件中的bean加载到Application Context中。

@ImportResource({ “ classpath *:applicationContext.xml ” })

在Spring Boot的入口类中我们使用:

@SpringBootApplication
@EnableSwagger2
@ImportResource({"classpath*:applicationContext.xml"})
public class ProductApplication {

   public static void main(String[] args) {
      SpringApplication.run(ProductApplication.class, args);
   }
}

推荐的方法是创建一个单独的配置类来加载此XML bean定义文件。

@Configuration
@ImportResource({"classpath*:applicationContext.xml"})
public class XmlConfiguration {
}

19、Spring Boot 2.X 有什么新特性?与 1.X 有什么区别?

  • 配置变更
  • JDK 版本升级
  • 第三方类库升级
  • 响应式 Spring 编程支持
  • HTTP/2 支持
  • 配置属性绑定
  • 更多改进与加强...

20、SpringBoot常用的starter

1、spring-boot-starter-web(嵌入Tomcat和web开发需要的servlet和jsp支持)
2、spring-boot-starter-data-jpa(数据库支持)
3、spring-boot-starter-data-Redis(Redis支持)
4、spring-boot-starter-data-solr(solr搜索应用框架支持)
5、mybatis-spring-boot-starter(第三方mybatis集成starter)

21、SpringBoot自动配置原理:

1、@EnableAutoConfiguration这个注解会"猜"你将如何配置spring,前提是你已经添加了jar依赖项,如果spring-boot-starter-web已经添加Tomcat和SpringMVC,这个注释就会自动假设您在开发一个web应用程序并添加相应的spring配置,会自动去maven中读取每个starter中的spring.factories文件,该文件里配置了所有需要被创建spring容器中bean
2、在main方法中加上@SpringBootApplication和@EnableAutoConfiguration

22、SpringBoot starter工作原理:

1、SpringBoot在启动时扫描项目依赖的jar包,寻找包含spring.factories文件的jar
2、根据spring.factories配置加载AutoConfigure
3、根据@Conditional注解的条件,进行自动配置并将bean注入到Spring Context

 

你可能感兴趣的:(SpringBoot)