准备了一些面试官常问的springboot问题,快来看看吧

摘要

本文主要介绍了如何在 Spring Boot 中实现常用的 Web 开发功能,包括 RESTful 接口、缓存、文件上传下载、定时任务和跨域处理。通过本文的学习,读者可以了解到 Spring Boot 的基本用法以及如何使用 Spring Boot 开发 Web 应用。本文提供了清晰的代码示例和详细的操作步骤,希望能够帮助读者更好地使用 Spring Boot 进行 Web 开发。

Spring Boot 中的注解 @RestController 和 @Controller 有什么区别?

@RestController 和 @Controller 注解都用于处理 HTTP 请求,区别在于:

  • @Controller 注解需要在每个方法上添加 @ResponseBody 注解,才能将返回值直接输出到 HTTP 响应体中,而
    @RestController 注解则可以省略 @ResponseBody 注解。
  • @RestController 注解相当于同时使用了 @Controller 和 @ResponseBody 注解,因此常用于
    RESTful Web 服务开发中。

Spring Boot 中如何处理异常?

Spring Boot 提供了一个全局异常处理器,通过实现 ExceptionHandler 接口并使用 @ControllerAdvice 注解,可以捕获和处理全局异常。另外,Spring Boot 还提供了一些注解,如 @ExceptionHandler、@ResponseStatus 和 @ControllerAdvice 等,用于处理异常和返回自定义的 HTTP 状态码。

使用 @ExceptionHandler 注解处理特定类型的异常:使用 @ExceptionHandler 注解可以将特定类型的异常映射到一个处理方法上,从而实现对异常的统一处理。

例如,如果要处理自定义的 MyException 异常,可以定义一个处理方法如下:

@ExceptionHandler(MyException.class)
public ResponseEntity<String> handleMyException(MyException ex) {
    
    
    return new ResponseEntity<>("MyException occurred: " + ex.getMessage(), HttpStatus.BAD_REQUEST);
}

实现 ErrorController 接口处理未捕获的异常:实现 ErrorController 接口可以处理未被其他方式捕获的异常,例如 404 错误。

例如,可以实现如下的 ErrorController:

@RestController
public class CustomErrorController implements ErrorController {
    
    

    private static final String PATH = "/error";

    @RequestMapping(value = PATH)
    public ResponseEntity<String> error() {
    
    
        return new ResponseEntity<>("An error occurred", HttpStatus.INTERNAL_SERVER_ERROR);
    }

    @Override
    public String getErrorPath() {
    
    
        return PATH;
    }
}

使用 @ControllerAdvice 注解处理全局异常:使用 @ControllerAdvice 注解可以定义一个全局异常处理器,可以处理所有未被其他方式捕获的异常。

例如,可以定义如下的全局异常处理器:

@ControllerAdvice
public class GlobalExceptionHandler {
    
    

    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleException(Exception ex) {
    
    
        return new ResponseEntity<>("An exception occurred: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

以上是处理异常的几种方式,具体使用哪种方式需要根据实际情况进行选择。

如何使用 Spring Boot 集成 MyBatis?

使用 Spring Boot 集成 MyBatis 需要添加 MyBatis 和 MyBatis-SpringBoot-Starter 两个依赖,并在配置文件中添加相关配置,如数据源配置和 MyBatis 配置等。

Spring Boot 中如何使用 AOP?

Spring Boot 中使用 AOP 需要引入 spring-boot-starter-aop 依赖,并定义切面和通知。可以使用 @Aspect 注解定义切面,使用 @Before、@After 和 @Around 等注解定义通知。

如何在 Spring Boot 中使用缓存?

在 Spring Boot 中使用缓存需要引入 spring-boot-starter-cache 依赖,并在配置文件中定义缓存配置,如缓存类型、缓存管理器等。可以使用 @Cacheable、@CachePut、@CacheEvict 等注解在方法上添加缓存相关的行为。
Spring Boot 中支持多种缓存解决方案,包括 EhCache、Redis、Caffeine 等。你可以选择任何一个作为你的缓存解决方案,下面以 EhCache 为例介绍如何在 Spring Boot 中使用缓存。
1.添加 EhCache 依赖
在 pom.xml 文件中添加 EhCache 的依赖:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
  <groupId>net.sf.ehcache</groupId>
  <artifactId>ehcache</artifactId>
</dependency>

2.配置 EhCache
在 application.properties 文件中添加 EhCache 的配置:

spring.cache.type=ehcache

3.编写缓存逻辑
在需要缓存的方法上添加 @Cacheable 注解,例如:

@Service
public class UserServiceImpl implements UserService {
    
    

  @Override
  @Cacheable("users")
  public User getUserById(Long id) {
    
    
    // 从数据库中获取用户信息
    return userDao.getUserById(id);
  }

}

上述代码中,@Cacheable(“users”) 表示对该方法进行缓存,并指定了缓存的名称为 “users”。
4.测试缓存
在测试代码中调用上述方法,多次调用可以发现第一次查询数据库,之后的调用直接从缓存中获取数据。

@SpringBootTest
public class UserServiceTest {
    
    

  @Autowired
  private UserService userService;

  @Test
  public void testGetUserById() {
    
    
    Long id = 1L;
    userService.getUserById(id); // 第一次查询数据库
    userService.getUserById(id); // 从缓存中获取数据
    userService.getUserById(id); // 从缓存中获取数据
  }

}

以上就是使用 EhCache 缓存的基本步骤,在使用其他缓存解决方案时,步骤类似,只需修改配置和依赖即可。

Spring Boot 中如何实现文件上传和下载?

在 Spring Boot 中实现文件上传和下载需要使用 Spring Web MVC 框架提供的 MultipartFile 类和 ResponseEntity 类。上传文件可以使用 @PostMapping 注解和 MultipartFile 类,下载文件可以使用 @GetMapping 注解和 ResponseEntity 类。

文件上传

文件上传需要借助 MultipartFile 对象来处理上传的文件。

1.添加依赖
在 pom.xml 文件中添加 Spring Web 的依赖:

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

2.配置上传文件大小限制
在 application.properties 文件中添加配置:

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

3.编写上传文件的接口

@RestController
public class FileUploadController {
    
    

    @PostMapping("/upload")
    public String handleFileUpload(@RequestParam("file") MultipartFile file) throws IOException {
    
    
        // 获取文件名
        String fileName = file.getOriginalFilename();
        // 保存文件到指定目录
        file.transferTo(new File("/path/to/save/" + fileName));
        return "File uploaded successfully";
    }
}

上述代码中,@RequestParam(“file”) 表示上传的文件参数名为 “file”,file.transferTo() 方法将文件保存到指定目录中。

文件下载

文件下载需要借助 HttpServletResponse 对象来处理下载的文件。
1.编写下载文件的接口

@RestController
public class FileDownloadController {
    
    

    @GetMapping("/download")
    public void downloadFile(HttpServletResponse response) throws IOException {
    
    
        // 获取要下载的文件
        File file = new File("/path/to/download/file");
        // 设置响应头
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment; filename=" + file.getName());
        // 读取文件并写入响应输出流
        Files.copy(file.toPath(), response.getOutputStream());
        response.getOutputStream().flush();
    }
}

上述代码中,response.setContentType() 方法设置响应的 MIME 类型,response.setHeader() 方法设置响应头,Files.copy() 方法将文件读取并写入响应输出流中,完成文件下载。

以上就是文件上传和下载的基本实现方式,可以根据实际需要进行调整和优化。

Spring Boot 如何处理跨域问题?

Spring Boot 中处理跨域问题需要添加相关的跨域配置,如使用 @CrossOrigin 注解或配置 CorsFilter 过滤器。

@RestController
public class MyController {
    
    

  @CrossOrigin
  @GetMapping("/api/test")
  public String test() {
    
    
    return "Hello World!";
  }

}

@CrossOrigin 注解还可以配置跨域规则,例如:

@CrossOrigin(origins = "http://localhost:8080", maxAge = 3600)
@GetMapping("/api/test")
public String test() {
    
    
  return "Hello World!";
}

上述代码中,origins 参数指定允许访问的来源,maxAge 参数指定预检请求的有效期,单位为秒。

除了使用 @CrossOrigin 注解外,还可以在 Spring Boot 的配置文件中配置全局跨域规则,例如:

spring:
  cors:
    allowed-origins:
      - http://localhost:8080
    max-age: 3600

Spring Boot 中如何实现定时任务?

Spring Boot 中实现定时任务可以使用 Spring 的 @Scheduled 注解,它可以将一个方法标记为定时任务,并定义任务的执行规则,如执行时间、执行频率等。

@Component
public class ScheduledTask {
    
    

  @Scheduled(fixedRate = 5000) // 每隔 5 秒执行一次任务
  public void task() {
    
    
    // 执行定时任务逻辑
  }

}

上述代码中,@Scheduled(fixedRate = 5000) 表示每隔 5 秒执行一次任务,可以根据实际需要调整时间间隔。
@Scheduled 注解还有其他参数可以配置:

  • cron:Cron 表达式,指定任务的执行时间。例如:@Scheduled(cron = “0 0 12 * * ?”) 表示每天中午12 点执行任务。
  • fixedDelay:表示任务执行完毕后延迟多少毫秒再次执行。
  • fixedRate:表示任务执行开始时间与上一次执行结束时间间隔多少毫秒。
  • initialDelay:表示首次执行任务的延迟时间,单位为毫秒。

例如,以下代码表示每天中午 12 点执行任务,并且任务执行完毕后延迟 1 分钟再次执行:

@Scheduled(cron = "0 0 12 * * ?")
@Scheduled(fixedDelay = 60000)
public void task() {
    
    
    // 执行定时任务逻辑
}

异常处理
在定时任务中可能会抛出异常,需要对异常进行处理。可以使用 @Scheduled 注解的 exceptionalFor 参数来指定需要捕获的异常类型,例如:

@Scheduled(fixedRate = 5000, exceptionalFor = {
    
    IOException.class})
public void task() throws IOException {
    
    
    // 执行定时任务逻辑,可能会抛出 IOException 异常
}

上述代码中,指定了需要捕获的异常类型为 IOException,当出现 IOException 异常时,定时任务不会终止,而是继续执行下一次任务。

以上就是 Spring Boot 中实现定时任务的基本方式,可以根据实际需要进行调整和优化。

Spring Boot 中如何使用消息队列?

Spring Boot 中使用消息队列需要引入相应的消息队列依赖,并在配置文件中添加相关配置。常用的消息队列包括 RabbitMQ、ActiveMQ、Kafka 等。

Spring Boot 如何实现权限控制?

Spring Boot 实现权限控制可以使用 Spring Security 框架,它提供了一系列的安全认证和授权机制,可以通过配置角色、权限等实现细粒度的权限控制。

猜你喜欢

转载自blog.csdn.net/qq_27575627/article/details/130176399