几道有关spring boot 的面试题

面试题1:什么是Spring Boot?它有哪些主要特点?

答:Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。使用Spring Boot可以非常快速地开发出生产级别的Spring框架应用程序。

Spring Boot的主要优点包括:

  • 创建独立的Spring应用程序
  • 内嵌Tomcat,Jetty或Undertow直接运行
  • 提供opinionated ‘starter’依赖项简化构建配置
  • 自动配置Spring以及第三方库
  • 提供生产级别的监控、健康检查和外部化配置
  • 无代码生成、无需编写XML

面试题2:Spring Boot Starter是什么?你使用过哪些Spring Boot Starter?

答:Spring Boot Starter是一组方便使用的依赖关系描述符,可以包含在Spring Boot应用程序中。这些依赖关系描述符可以一站式添加所需的所有Spring和相关技术,而无需查找示例代码并将其拷贝到项目中。

一些常用的Spring Boot Starter包括:

  • spring-boot-starter-web - 用于构建Web应用程序,使用Tomcat作为默认嵌入式容器
  • spring-boot-starter-data-jpa - 用于使用Spring Data JPA与关系型数据库交互
  • spring-boot-starter-security - 用于使用Spring Security添加安全性功能
  • spring-boot-starter-test - 用于使用Junit、Hamcrest和Mockito进行测试
  • spring-boot-starter-actuator - 用于添加生产级监控和度量的功能

我在项目中使用过spring-boot-starter-web、spring-boot-starter-data-jpa、spring-boot-starter-security等。

面试题3:如何在Spring Boot应用程序中实现全局异常处理?

答:在Spring Boot中有几种方式可以实现全局异常处理:

  1. 通过@ControllerAdvice注解定义一个全局异常处理类,该类可以包含一些用@ExceptionHandler注解的方法来处理特定异常。

  2. 实现Spring的HandlerExceptionResolver接口,并将自定义异常处理器添加到应用程序上下文。

    扫描二维码关注公众号,回复: 16664412 查看本文章
  3. @RestControllerAdvice注解可以用于创建一个全局异常处理组件,该组件适用于所有使用@RequestMapping注解的控制器。

下面是一个使用@RestControllerAdvice的示例:

@RestControllerAdvice
public class GlobalExceptionHandler {
    
    

  @ExceptionHandler(value = Exception.class)
  public ResponseEntity<ErrorInfo> defaultErrorHandler(Exception e) {
    
    
    // 处理异常,返回ErrorInfo
  }

  @ExceptionHandler(value = {
    
    NullPointerException.class, IndexOutOfBoundsException.class})
  public ResponseEntity<ErrorInfo> specialErrorHandler(Exception e) {
    
      
    // 处理特定异常
  }
}

面试题4:如何在Spring Boot中实现定时任务?

答:Spring Boot提供几种不同的方式来实现定时任务:

  1. 使用Spring的@Scheduled注解,可以将其添加到任何Spring管理的Bean的方法上。

  2. 使用@EnableScheduling注解启用计划任务,然后添加@Scheduled注解。

  3. 实现Spring TaskExecutor接口的自定义线程池,进行更细粒度的执行控制。

  4. 使用Spring Boot提供的集成Quartz Scheduler,进行基于Cron表达式的计划任务。

下面是一个使用@Scheduled注解的简单示例:

@Component
public class ScheduledTasks {
    
    

  @Scheduled(fixedRate = 1000)
  public void scheduleTask() {
    
    
    // 定时任务逻辑
  }
}

面试题5:如何实现异步调用在Spring Boot应用程序中?

答:Spring Boot提供以下几种方式来实现异步调用:

  1. 使用@Async注解,可以在任何Spring Bean方法上使用,该方法将异步执行。

  2. 使用@EnableAsync注解启用异步调用功能,配合@Async注解使用。

  3. 实现Java的Callable接口,在其中封装异步执行逻辑,然后提交给Spring的TaskExecutor。

  4. 使用Spring的@AsyncResult注解返回一个异步执行的结果。

  5. 使用DeferredResult封装异步执行的结果。

下面是一个使@Async注解的示例:

@Service
public class AsyncService {
    
    

  @Async
  public void asyncMethod() {
    
    
    // 执行异步逻辑
  } 
}

调用方:

@Autowired
private AsyncService service;

service.asyncMethod(); // 此方法会异步执行

面试题6:Spring Boot Actuator是什么?它有哪些主要功能?

答:Spring Boot Actuator是Spring Boot提供的一个子项目,提供了一系列用于监控和管理Spring Boot应用程序的REST端点。使用Actuator可以实时查看应用程序运行时的内部状态和统计信息。

Actuator主要功能包括:

  • 应用程序健康检查 - 提供应用程序健康状态、磁盘空间、数据库连接等信息。

  • 指标监控 - 运行时指标如内存用量、HTTP请求计数等。

  • 外部化配置 - 查看和更新应用配置信息。

  • 审计 - 审计应用访问日志,错误日志等。

  • 异步方法监控 - 监控异步方法的执行信息。

  • 集成Graphite,Zipkin等外部监控系统。

要使用Actuator,需要在项目中添加spring-boot-starter-actuator依赖。

面试题7:如何在Spring Boot中实现缓存?

答:Spring Boot提供了多种缓存实现,可以通过starter依赖项轻松集成:

  1. 使用spring-boot-starter-cache集成Spring Cache,通过@EnableCaching和@Cacheable等注解实现缓存。

  2. 使用spring-boot-starter-data-redis集成Redis,通过Spring Data Redis和Lettuce客户端作为缓存提供者。

  3. 使用spring-boot-starter-data-couchbase集成Couchbase作为缓存。

  4. 使用spring-boot-starter-hazelcast集成Hazelcast作为分布式缓存实现。

  5. 使用spring-boot-starter-jcache集成JSR-107(JCache)标准的缓存提供者。

下面是一个使用Spring Cache的示例:

@Service
@CacheConfig(cacheNames="books") 
public class BookService {
    
    

  @Cacheable
  public Book getBook(ISBN isbn) {
    
    
    // 缓存逻辑
  }
}

面试题8:如何在Spring Boot中集成Swagger来实现API文档?

答:可以通过以下步骤集成Swagger生成Spring Boot应用API文档:

  1. 添加Swagger依赖springfox-swagger2、springfox-swagger-ui。

  2. 创建Swagger配置类,使用@EnableSwagger2注解启用Swagger。

  3. 使用Swagger注解如@Api、@ApiOperation等注解Controller类和方法。

  4. 访问/swagger-ui.html查看自动生成的API文档。

  5. 可以通过Swagger配置自定义文档信息,如标题、描述、版本等。

下面是一个示例配置类:

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    
    

  @Bean
  public Docket api() {
    
    
    return new Docket(DocumentationType.SWAGGER_2)
      .select()
      .apis(RequestHandlerSelectors.any())
      .paths(PathSelectors.any())
      .build();
  }
}

猜你喜欢

转载自blog.csdn.net/orton777/article/details/131852763