Java面试题整理《SpringBoot篇》

什么是 Spring Boot?

Spring的缺点:

  • 复杂的配置: 配置十分繁琐,环境配置会占用写应用程序逻辑的时间,增加开发时的损耗。
  • 依赖管理: 项目的依赖管理也是一件耗时耗力的事情。在环境搭建时,需要分析要导入哪些库的坐标,而且还需要分析导入与之有依赖关系的其他库的坐标。

SpringBoot是Spring项目中的一个子工程,它对上述Spring的缺点进行的改善和优化,基于约定优于配置思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期。

两个核心功能:

  • 起步依赖:起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。
  • 自动配置: Spring Boot的自动配置是一个运行时的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个,该过程是Spring自动完成的。

Spring Boot 有哪些特点?

  • 容易上手,快速创建独立的spring应用程序
  • 尽可能的自动配置spring和第三方库,开箱即用
  • 内嵌服务器tomcat、jetty和undertow(不需要打包成war包部署)
  • 提供了固定化的“starter”配置,以简化构建配置
  • 提供产品级的功能,如:安全指标、运行状况监测和外部化配置等
  • 不会生成代码,并且不需要XML配置

人们把Spring Boot称为搭建程序的脚手架。它能帮我们快速的构建庞大的spring项目,并且尽可能的减少一切xml配置,这样我们在开发时关注点集中在了业务问题上,而不再是配置问题上,可以非常轻松的开始应用程序。


Spring、Spring MVC和Spring Boot有什么区别?

  • Spring是一个Ioc容器,用来管理Bean,使用依赖注入实现控制反转,可以很方便的整合各种框架,提供AOP机制弥补OOP的代码重复问题、更方使将不同类不同方法中的共同处理抽取成切面、自动注入给方法执行,比如日志、异常等。
  • SpringMVC是 spring对web框架的—个解决方案,提供了一个总的前端控制器 Servlet,用来接收请求,然后定义了套路由策略(url到 handle的映射)及适配执行 handle,将 handle结果使用视图解析技术生成视图展现给前端
  • SpringBoot,是 spring提供的一个快速开发工具包,让程序员能更方便、更快速的开发 Spring+ SpringMVC应用,简化了配置(约定了默认配置),整合了一系列的解决方案( starter机制)、 redis、 mongodb、es,可以开箱即用。

SpringBoot核心注解

@SpringBootApplication其实是一个组合注解,这里重点的注解有3个:

  • @SpringBootConfiguration:声明配置类
  • @EnableAutoConfiguration:开启自动配置
  • @ComponentScan:开启注解扫描(扫描与其同级)

在这里插入图片描述

@SpringBootConfiguration注解:注解中应用了@Configuration注解,其作用就是声明当前类是一个配置类@SpringBootConfiguration用来声明当前类是SpringBoot应用的配置类,项目中只能有一个,一般我们无需自己添加。

@EnableAutoConfiguration注解:注解中的@Import注解,其作用是当前配置文件中引入其他配置类。这里引入了AutoConfigurationImportSelector类,在这个类中有相应的方法用来加载文件(spring.factories)中的配置,之后@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IOC容器中,进而实现@EnableAutoConfiguration自动配置的功能。

  • 加载的文件:(spring-boot-autoconfigure.jar/META-INF/*)
    SpringBoot内部对大量的第三方库或Spring内部库进行了默认配置,这些配置是否生效,取决于我们是否引入了对应库所需的依赖,如果有那么默认配置就会生效。我们在使用SpringBoot构建项目时,只需要引入所需依赖,配置部分交给了SpringBoot处理。

@ComponentScan注解:类似与<context:component-scan>标签,通过basePackageClasses或者basePackages属性来指定要扫描的包。如果没有指定这些属性,那么将从声明这个注解的类所在的包开始,扫描包及子包,而我们的@ComponentScan注解声明的类就是main函数所在的启动类,因此扫描的包是该类所在包及其子包。一般启动类会放在一个比较浅的包目录中。

关闭某个自动配置的选项:@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })


SpringBoot的配置文件

SpringBoot是基于约定的,其中有许多配置都有默认值,而这些默认配置是可以进行覆盖的,我们可以使用application.properties或者application.yml(application.yaml)进行重新配置。SpringBoot默认会从Resources目录下依次加载application.yml文件、application.yaml、application.properties文件,后加载的文件会对前面的文件进行覆盖。

扫描二维码关注公众号,回复: 13792015 查看本文章

配置加载顺序:application.yml文件、application.yaml、application.properties文件、系统环境变量、命令行参数

application.yml配置文件:

YML文件格式是YAML编写的文件格式(文件拓展名YML文件的扩展名.yml、.yaml),YAML是一种直观的能够被电脑识别的的数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入。YML文件是以数据为核心的,比传统的xml方式更加简洁。

YAML 配置的优势在哪里 ?

  • 分层配置数据、数据是有序的
  • 支持数组,数组中的元素可以是基本数据类型也可以是对象

bootstrap.properties 和 application.properties 有何区别 ?

单纯做 Spring Boot 开发,可能不太容易遇到 bootstrap.properties 配置文件,但是在结合 Spring Cloud 时,这个配置就会经常遇到了,特别是在需要加载一些远程配置文件的时侯。

spring boot 核心的两个配置文件:

  • bootstrap (. yml 或者 . properties):boostrap 由父 ApplicationContext 加载的,比 applicaton 优先加载,配置在应用程序上下文的引导阶段生效。一般来说我们在 Spring Cloud Config 或者 Nacos 中会用到它。且 boostrap 里面的属性不能被覆盖;
  • application (. yml 或者 . properties): 由ApplicatonContext 加载,用于 spring boot 项目的自动化配置。

开启SpringBoot特性的几种方式?

  • 继承spring-boot-starter-parent项目
  • 导入spring-boot-dependencies项目依赖

SpringBoot 中的starter?

starter可以理解成对依赖的一种合成,避免了开发人员手动添加依赖,大大的提升了开发效率。

程序中定义了一个starter的jar包,通过@Configuration配置类,将这些bean定义到里面,然后在starter包的META-INF/spring.factories中写入配置类,Springboot按照约定来加载配置类。开发人员只需要将相应的starter包的依赖添加到应用中,进行相应的属性配置(有默认值),就可以直接进行代码开发了。


什么是 JavaConfig?

Spring JavaConfig 是 Spring 社区的产品,Spring 3.0引入了他,它提供了配置 Spring IOC 容器的纯Java 方法。因此它有助于避免使用 XML 配置。

JavaConfig 的优点:

  • 面向对象的配置。由于配置被定义为 JavaConfig 中的类,因此用户可以充分利用 Java 中的面向对象功能。一个配置类可以继承另一个,重写它的@Bean 方法等。
  • 减少或消除 XML 配置。JavaConfig 为开发人员提供了一种纯 Java 方法来配置与 XML 配置概念相似的 Spring 容器。
  • 类型安全和重构友好。JavaConfig 提供了一种类型安全的方法来配置 Spring容器。由于 Java5.0 对泛型的支持,现在可以按类型而不是按名称检索 bean,不需要任何强制转换或基于字符串的查找。

常用的Java config:

  • @Configuration:在类上打上写下此注解,表示这个类是配置类
  • @ComponentScan:在配置类上添加 @ComponentScan 注解。该注解默认会扫描该类所在的包下所有的配置类,相当于之前的 <context:component-scan >。
  • @Bean:bean的注入:相当于以前的< bean id=“objectMapper” class=“org.codehaus.jackson.map.ObjectMapper” />
  • @EnableWebMvc:相当于xml的<mvc:annotation-driven >
  • @ImportResource: 相当于xml的 < import resource="applicationContext-cache.xml

CSRF 攻击?

CSRF 代表跨站请求伪造。这是一种攻击,迫使最终用户在当前通过身份验证的Web 应用程序上执行不需要的操作。CSRF 攻击专门针对状态改变请求,而不是数据窃取,因为攻击者无法查看对伪造请求的响应。

猜你喜欢

转载自blog.csdn.net/Lzy410992/article/details/119565110