您的当前位置:首页正文

SpringBoot (面试篇)

2024-11-08 来源:个人技术集锦

什么是SpringBoot

通过SpringBoot,可以轻松的创建独立的,基于生产级别的Spring的应用程序,您可以“运行”它们。大多数SpringBoot应用程序要最少的Sprig配置

为什么要用SpringBoot

快速开发

快速整合

配置简化

内嵌服务容器

SpringBoot与SpringCloud区别

SpringBoot是快速开发的Spring框架,SpringCloud是完整的微服务框架,SpringCloud依赖于SpringBoot。

SpringBoot有哪些优点?

SpringBoot主要有如下优点:

1. 容易上手,提升开发效率,为Spring开发提供一个更快、更简单的开发框架。

2. 开箱即用,原理繁琐的配置。

3. 提供了一系列大型项目通用的非业务性能,例如:内嵌服务器、安全管理、运行数据监控、运行状况检查和外部化配置等。

4. SpringBoot总结就是使用编程变简单、配置变简单、部署变简单、监控变简单等等

SpringBoot核心注解是哪个?它主要由哪几个注解组成的?

1. 启动类上的注解使@SpringBootApplication,他也是SpringBoot的核心注解,主要组合包含以下三个注解:

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

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

                1. @ComponentScan:Spring组件扫描

Spring Boot Starter的工作原理

1. 在SpringBoot启动时由@SpringBootApplication注解会自动去maven中读取每个starter中的spring.factories文件,该文件里配置了所有需要被创建spring容器中的bean,并且进行自动配置把bean注入SpringContext中//(SpringContext是Spring的配置文件)

2. 其实SpringBoot就是由各种Starter组合起来的,我们自己也可以开发Starter

StringBoot2.x 有扫描新特性?与1.x有扫描区别?

1. 配置变更

2. JDK版本升级

3. 第三方类库升级

4. 响应式Spring编程支持

5. HTTP/2支持

6. 配置属性绑定

7. 更多改进与加强

SpringBoot支持什么前端模板

thymeleaf,freemarker,jsp,官方不推荐JSP会有什么限制

SpringBoot事务的使用

SpringBoot的事务很简单,首先使用注解EnableTransactionManagement开启事务之后,然后再Service方法上注解Transactional便可。

Async异步调用方法

在SpringBoot中使用异步调用是很简单的,只需要在方法上使用@Async注解即可实现方法的异步调用。注意:需要在启动类加入@EnableAsync使用使用异步调用@Async注解失效

如何在SpringBoot启动的时候运行一些特定的代码?

可以实现接口ApplicationRunner或者CommandLineRunner,这两个接口实现方法一样,它们都只提供一个run方法

SpringBoot启动类注解?它是由哪些注解组成?

@SpringBootAppliation

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

        2. @EnableAutoConguration:打开自动配置的功能,也可以关闭某个自动配置的选项。

        3. @SpringBootApplication (exclude = {DataSourceAutoConfiguration.class})

        4. @ComponenScan:Spring组件扫描

什么是yaml?

yaml是一个可读性高,用来表达数序列化的格式。yaml参考了其他多种语言,包括:C语言、Python、Perl。根据结构性。

SpringBoot启动方式

1. Main方法

2. 命令行java -jar的方式

3. mvn/gradle

SpringBoot需要独立的容器运行?

不需要,内置了Tomcat/jetty。

SpringBoot配置途径有什么?

1. 命令行参数

2. java:comp/env里的JNDI属性

3. JVM系统属性

4. 操作系统环境变量

5. 随机生成带random.* 前缀的属性(在设置其他属性时,可以引用它们,比如${random.long})

6. 应用程序内的application。properties或则application.yml文件

7. 打包应用在应用程序内的application》properties或则application.yml文件

8. 通过@PropertySource标注的属性源

9. 默认属性

applicaiton.prperties和application.yml文件可放位置?优先级?

3. 内置,在config包内

        这个列表按照优先级排序,优先级高的会覆盖优先级低的,当然我们也可以自己指定文件的位置来加载配置文件。

java -jar xiaka.jar ----spring.config.location=/home/application.yml

SpringBoot自动配置原理?

@EnableAutoConfiguration (开启自动配置)该注解引入了AutoConfigurationImportSelector,该类中的方法会扫描所有存在META-INF/spring.factories的jar包

SpringBoot热部署方式?

1. spring-boot-devtools

2. Spring Loaded

3. Jrebel

4. 热模板部署

[bootstarp.yml]和[application.yml]?

bootstrap.yml优先于application.yml

SpringBoot如何修改端口号?

yml:

server :
    port : 8080

properties:

server.port = 8080

命令1

java -jar xiaoka.jar ----server.port = 8080

命令2

java - Dserver.port = 8080 -jar xiaokao.jar

SpringBoot如何兼容Spring项目?

在启动类加:

@ImportResource(locations = {"classpath:spring.xml"})

SpringBoot配置监控?

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

针对请求访问的几个组合注解?

1. @PatchMapping

2. @PostMapping

3. @GetMapping

4. @PutMapping

5. @DeleteMapping

SpringBoot中的starter?

可以理解成对依赖的一种合成,starter会把一个或一套功能相关依赖都包含进来,避免了自己去依赖费事,还有各种包冲突问题。大大的提升了开发效率。

并且相关配置会有一个默认值,如果我们自己去配置,就会覆盖默认值。

SpringBoot集成Mybatis?

mybatis-spring-boot-starter

不同环境的配置文件?

可以时application-{profile}.properties/yml,但默认时启动主配置文件application.properties,一般来说我们的不同环境配置如下。

1. application.properties:主配置文件

2. application-dev.properties:开发环境配置文件

3. application-test.properties: 测试环境配置文件

4. application.prop-properties: 生产环境配置文件

如何激活某个环境的配置 ?

比如我峨嵋你激活开发环境。

yml:

spring :
    profiles :
        actice :dev

properties:

spring.profiles.actice = dev

命令行

java -jar xiaokao-v1.0.jar ----spring.profile.actice = dev

编写测试用例的注解?

@SpringBootTest

方法测试

@Test

SpringBoot异常处理相关注解?

@ControllerAdvice

@ExceptionHandler

Spring Boot读取配置相关注解有

@PropertSource

@Value

@Enviromment

@ConfigurationProperties

什么是JavaConfig?

  • Spring Java Config是Spring社区的产品,Spring3.0引入了他,它提供了配置SpringIOC容器的纯Java方法。因此它有助于避免使用XML配置。使用JavaConfig的优点在于:
    • 面向对象的配置。由于配置被定义为JavaConfig中的类,因此用户可以充分利用Java中的面向对象功能。一个配置类可以继承另一个,重写它的@Bean方法等。
    • 减少消除XML配置。基于依赖注入原则的外化配置的好处已被证明。但是,需要开发人员不希望XML和Java之间来回切换。JavaConfig为开发人员提供一种纯Java方法来配置与XML配置概念相识的Spring容器。从技术角度来讲,只使用JavaConfig配置类来配置容器可行的,但实际上很多人认为将JavaCofig与XML混合匹配时理想的。
    • 类型安全和重构友好。JavaConfig提供了一种类型安全的方法来配置Spring容器。由于Java5.0对泛型的支持,现在可以按照类型而不是按名称检索bean,不需要任何强制转换或基于字符串的查找。
  • 常用的Java Config:
    • @Cofiguration:在类上打上写下此注解,表示这个类是配置类
    • @ComponentScan:在配置类上添加@ComponentScan注解。该注解默认会扫描该类锁在的包下所有的配置类,相当于之前的<context:component-scan>。
    • @Bean:bean的注入:相当于以前的<bean id="objectMapper" class="org.codehaus.jackson.map.ObjectMapper"/>
      • @EnableWebMvc:相当于xml的<mvc:annotaiton-driven>
      • @ImportResource:相当于xml的<import resource="applicationContext-cache.xml">

SpringBoot的自动配置原理是什么?

1. 主要是SpringBoot的启动类上的核心注解SpringBootApplication注解主配置类,有了这个主配置类启动时就会为SpringBoot开启一个@EnableAutoConfiguration注解自动配置功能。

2. 有了这个EnableAutoConfiguration的话就会:

        1. 从配置文件META_INF/Spring。factores加载可能用到的自动配置类

        2. 去重,并将exclude和excludeName属性携带的类排除

        3. 过滤,将满足条件(@Conditional)的自动配置类返回

如何理解SpringBoot配置加载顺序?

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

        1. properties文件

        2. Yaml文件

        3. 系统环境变量

        4. 命令行参数

        5. 等等...

SpringBoot和兴配置文件是什么?

  • SpringBoot核心的两个配置文件:
    • bootstrap(.yml或则.properties):bootstrap由弗雷ApplicationContext加载的,比application优先加载,配置在应用程序上下文的引导阶段生效。一般来说我们在spring cloud配置就会使用这个文件。且bootstarp里面的属性不能被覆盖;
    • application(.yml或则.properties):由ApplicationContext加载,用于springboot项目的自动化配置。

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

单纯做SpringBoot开发,可能不太容易遇到bootstarp.properties配置文件,但在结合SpringCloud时,这个配置就会经常遇到了,特别是在需要加载一些配置文件的时候。

什么是Spring profiles

  • 在项目的开发中,有些配置文件在开发、测试或者生产等不同环境中可能是不同的,例如数据库连接、redis的配置等等。那我们如何在不同环境中自动实现配置的切换呢?Spring给我们提供了profiles机制给我们提供的就是来回切换配置文件的功能
  • Spring Profiles 允许用户根据配置文件(dev,test,prod 等)来注册 bean。因此,当应用程序在开发中运行时,只有某些 bean 可以加载,而在 PRODUCTION中,某些其他 bean 可以加载。假设我们的要求是 Swagger 文档仅适用于 QA 环境,并且禁用所有其他文档。这可以使用配置文件来完成。Spring Boot 使得使用配置文件非常简单。

如何实现SpringBoot应用程序的安全性?

为了实现SpringBoot的安全性,我们使用spring-boot-starter-security依赖项,并且必须添加安全配置。它只需要很少的代码。配置类将必须扩展WebSecurityConfigurerAdapter并覆盖其方法。

比较以下Spring Secutity和Shiro各自优缺点?

  • 由于 Spring Boot 官方提供了大量的非常方便的开箱即用的 Starter ,包括 Spring Security 的

Starter ,使得在 Spring Boot 中使用 Spring Security 变得更加容易,甚至只需要添加一个依赖就可以保护所有的接口,所以,如果是 Spring Boot 项目,一般选择 Spring Security 。当然这只是一个建议的组合,单纯从技术上来说,无论怎么组合,都是没有问题的。Shiro 和 SpringSecurity

相比,主要有如下一些特点:

优化SpringBoot程序启动速度

  1. 懒加载:在配置文件中添加(节约1~2秒)
spring:
  main:
    lazy-initialization: true

  1. 创建扫描索引
    spring5之后提供了spring-context-indexer功能,可以通过在编译时创建一个静态候选列表来提高大型应用程序的启动性能。
    先看官方的解释:

    在项目中使用了@Indexed之后,编译打包的时候会在项目中自动生成META-INT/spring.components文件。当Spring应用上下文执行ComponentScan扫描时,META-INT/spring.components将会被CandidateComponentsIndexLoader读取并加载,转换为CandidateComponentsIndex对象,这样的话 步骤:
    1. 引入依赖
    2. 启动类添加@Indexed

      大约节约时间时1到2秒
  1. 最优方法升级jdk17和springboot3
    1. jdk17优秀的垃圾回收
    2. springboot3,提供了本地化

读取配置的六种方法

  1. @Value()
    1. @Value(“${spring.name:默认值}”)
    2. 条件:
      1. 首先你所在这个类必须时一个Bean
      2. 读取的这个配置,配置文件中必须要有,否则启动的时候就会报错
  1. @ConfigurationProperties(prefix = “xushu”)
    1. 如下添加
    2. 自动将xushu.name配置到上方name中
    3. 适用于皮两个绑定Environment
    4. 如下使用:
      1. 也可以通过实现EnvironmentAware接口,重写setEnvironment来实现Envireonment,如下:
  1. @propertysource注解
  2. 获取外部配置
  3. 可以通过@PropertySources去获取xushu.properties文件里的配置,如下但是这样只能获取properties文件,想要获取一个yaml文件就需要添加
  4. java原生

SpringBoot中监视器是什么?

Spring boot actuator 是 spring 启动框架中的重要功能之一。Spring boot 监视器可帮助您访问生产环境中正在运行的应用程序的当前状态。有几个指标必须在生产环境中进行检查和监控。使一些外部应用程序可能正在使用这些服务来向相关人员触发警报消息。监视器模块公开了一组直接作为 HTTP URL 访问的REST 端点来检查状态。

如何监视所有SpringBoot微服务?

Spring Boot 提供监视器端点以监控各个微服务的度量。这些端点对于获取有关应用程序的信息(如它们是否已启动)以及它们的组件(如数据库等)是否正常运行很有帮助。但是,使用监的一个主要缺点或困难是,我们必须单独打开应用程序的知识点以了解其状态或健康状况。想象一下涉及 50 个应用程序的微服务,管理员将不得不击中所有 50 个应用程序的执行终端。为了帮助我们处理这种情况,我们将使用位于的开源项目。 它建立在 Spring Boot Actuator 之上,它提供了一个 Web UI,使我们能够可视化多个应用程序的度量。

SpringBoot解决跨域问题

JSONP跨域

前端:
后端:
  1. jsonp的优点就是因为他够老,能兼容各种浏览器,无兼容问题。
  1. jsonp缺点:只支持get,而且存在安全问题
  1. 技术发展至今,jsonp这种前后端耦合的方式基本已被取代

@CrossOrigin注解

主要针对接口

实现WebMvcMvcConfigurer接口

设置一批接口实现跨域

后端
前端
  1. CORS从具体的代码实现上来说比较方便,前端几乎不需要任何代码就可以支持。住哟啊是靠服务端进行配置。
  1. CORS需要浏览器和服务端同时支持。目前所有浏览器都支持该功能,ie浏览器不能低于ie10.
  1. 浏览器一旦发现ajax请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。

使用nginx

跨域请求nginx

SpringBoot的核心注解

1. @SpringBootApplication注解:这个注解标识了一个SpringBoot工程,它实际上是另外三个注解的组合,这三个注解是:

        1. @SpringBootConfiguration:这个注解实际上就是一个@Configuration,标识启动类也是一个配置类

        2. Auto Configuration:向Spring容器中导入了一个Selector,用来加载ClassPath下SpringFactories中所有定义的自动配置类,将这些自动加载为Bean

        3. @Conditional也很关键,如果没有它无法在自定义应用中进行定制开发

                1. @ConditionalOnBean

                2. @ConditionalOnClass

SpringBoot读取配置文件的原理是什么?加载顺序是怎样的?

通过时间监听的方式读取的配置文件:ConfigFileApplicationListener

优先级从高到低,高优先级的配置覆盖低优先级的配置,所有配置会形成互补配置。

1. file: ../config

2. file: ./config

3. file: ../

4. classpath: config/

5. classpath: 

springboot微服务中如何实现session共享?

在微服务中,一个完整的项目被拆分成多个不相同的独立的服务,各个服务独立部署在不同的服务器上,各自的session被从物理空间上隔离开了,但是经常,我们需要在不同微服务之间共享session ,常见的方案就是 Spring Session + Redis 来实现 session 共享。将所有微服务的session 统一保存在 Redis 上,当各个微服务对 session 有相关的读写操作时,都去操作 Redis上的 session 。这样就实现了 session 共享,Spring Session 基于 Spring 中的代理过滤器实现使得 session 的同步操作对开发人员而言是透明的,非常简便。

使用哪些starter maven依赖项

是一个你了下面的一些依赖项:

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

在SpringBoot中如何实现定时任务?

1. 在Spring Boot 中使用定时任务主要有两种不同的方式,一个就是使用Spring中@Scheduled注解,另一则是使用第三方框架Quartz。

2. 使用Spring中的@Scheduled的方式主要通过 @Scheduled注解实现。

SpringBoot如何实现打包

2. 或者点击左边选项栏中的Mavne,先点击clean在点击package

SpringBoot打成jar和普通的jar由上面区别?

1. Spring Boot 项目最终打包成jar是可执行jar ,这种jar可以直接通过java-jar xxx.jar命令来运行,这种jar不可做为普通的 jar 被其他项目依赖,即使依赖了也无法使用其中的类。

2.. SpringBoot的jar 无法被其他项目依赖,主要还是他和普通 jar 的结构不同。普通的jar包,解压后直接就包名,包里就是我们的代码,因此无法被直接引用。如果非要引用,可以在pom.xml文件中增加配置,将SpringBoot项目打包成两个jar,一个可执行,一个可引用

显示全文