Java经典面试题汇总:Spring Boot

关于Java经典面试题汇总:Spring Boot的完整攻略,我一方面可以介绍一些常见的Spring Boot面试题,另一方面也可以分享一些解决这些问题的方法和技巧。

Spring Boot常见面试题目

以下是一些常见的Spring Boot面试题目,你可以参考或练习它们:

1. Spring Boot的自动配置原理是什么?

2. Spring Boot如何启动一个Web应用?

3. Spring Boot如何处理跨域请求?

4. Spring Boot与Spring MVC的区别是什么?

5. Spring Boot如何配置数据源?

6. Spring Boot如何配置多个数据源?

7. Spring Boot如何实现实时刷新配置?

8. Spring Boot如何实现定时任务?

9. Spring Boot如何集成Mybatis?

10. Spring Boot如何集成Redis?

11. Spring Boot如何实现缓存?

12. Spring Boot如何处理异常?

13. Spring Boot如何实现文件上传?

14. Spring Boot如何实现Json数据的序列化和反序列化?

15. Spring Boot如何集成Swagger?

解决方法和技巧

面对这些问题,我可以给出一些解决方法和技巧。下面将简要介绍其中一些:

1. Spring Boot的自动配置原理是什么?

Spring Boot的自动配置原理涉及到条件注解、SPI机制和Spring Boot Starter。Spring Boot Starter 是个种依赖包,当引入某个 Starter 时,该 Starter 包下的一些依赖也会被自动引入到项目中,从而免去了开发人员自己添加配置文件等繁琐操作。同时,Spring Boot 根据应用的依赖和配置情况,利用条件注解和 SPI 机制,自动进行相应的配置。

2. Spring Boot如何启动一个Web应用?

主要有两种方式:

  • 使用 Spring Boot Maven 插件,在终端运行mvn spring-boot:run命令即可启动项目
  • 在 IDEA 的 Run 配置中,添加 Spring Boot 应用,选择 main 方法所在类即可启动项目。

示例一:

创建一个SpringBoot项目,并在其Controller中编写以下代码:

@RestController
public class HelloController{
   @GetMapping("/hello")
   public String hello(){
      return "Hello, world!";
   }
}

代码的作用是向客户端返回一个字符串“Hello, world!”。

在应用启动后,可以在浏览器访问 http://localhost:8080/hello 以获取到 “Hello, world!”的返回结果。

示例二:

在application.properties文件中添加如下配置:

server.port=9090

这会将应用的端口更改为9090,以便在启动时使用9090端口。

3. Spring Boot如何处理跨域请求?

解决跨域请求的问题,主要是利用了 CORS(Cross-Origin Resource Sharing)协议。在 Spring Boot 中,可以通过在 WebMvcConfigurer 接口中实现 addCorsMappings 方法,来定制自己的跨域配置。具体的代码可以参考:

@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
        .allowedOrigins("*")
        .allowedMethods("GET", "POST", "PUT", "DELETE")
        .allowedHeaders("*")
        .maxAge(3600)
        .allowCredentials(true);
    }
}

示例代码中,allowedOrigins 指允许跨域请求的域名,allowedMethods 指允许的请求方式,allowedHeaders 指允许发送的请求头,maxAge 指 preflight 请求(OPTIONS)的有效时间,allowCredentials 指是否允许发送 Cookie 等凭证信息。

4. Spring Boot与Spring MVC的区别是什么?

虽然 Spring Boot 和 Spring MVC 皆属于Spring框架,但它们的作用和应用场景却不完全相同。Spring MVC 通常用于搭建传统的 Web 应用程序,而 Spring Boot 则主要用于快速构建偏向于微服务架构的应用,例如RPC、消息队列、定时任务、缓存等。同时,Spring Boot 自带了 Tomcat、Jetty、Undertow服务器等嵌入式 Web 服务器,而Spring MVC需要手动添加。

示例一:

创建一个HelloController,并通过以下代码返回一个jsp页面:

@Controller
public class HelloController {
    @GetMapping("/")
    public String index() {
        return "index";
    }
}

在视图层resources/templates下创建index.jsp,编写以下代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>Hello Spring Boot!</h1>
</body>
</html>

在应用启动后,可以在浏览器访问 http://localhost:8080 以获取到 Hello Spring Boot!页面。

示例二:

创建一个自定义注解:

@Target(ElementType.METHOD) 
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginRequired {
}

在Controller中定义一个被该注解所修饰的RequestMapping:

@RestController
@RequestMapping("/user")
public class UserController {
    @LoginRequired
    @RequestMapping("/profile")
    public String profile() {
        return "Welcome to your profile page!";
    }
}

通过在 Spring Boot Application 启动类上添加@EnableWebMvc注解,使得应用程序运行时,可以启用Spring MVC的WebMvcConfigurerAdapter类以及MVC框架的所有默认配置。这样就可以实现注解拦截。

@SpringBootApplication
@EnableWebMvc
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

5. Spring Boot如何配置数据源?

通过在 application.yml 配置文件中添加如下配置:

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai
    username: root
    password: root

Spring Boot默认支持的数据源有如下几种:

  • com.zaxxer.hikari.HikariDataSource
  • org.apache.tomcat.jdbc.pool.DataSource
  • org.apache.commons.dbcp2.BasicDataSource

示例:

创建一个应用程序,使用Spring JPA将数据保存到数据库中。

定义一个实体类:

@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;

    private Integer age;

    // getter / setter
}

通过继承JpaRepository接口,即可使用JBPA提供的CRUD方法

public interface UserRepository extends JpaRepository<User, Long> {
    User findById(long id);
    void deleteById(Long id);
}

在Service层中进行具体操作:

@Service
public UserServiceImpl implements UserService {
    @Autowired
    private UserRepository userRepository;

    @Transactional
    @Override
    public User saveUser(User user) {
        return userRepository.save(user);
    }
}

6. Spring Boot如何配置多个数据源?

使用Dynamic Datasource路由,可以根据Key的不同自动路由到不同的数据源。

在pom.xml文件中添加如下依赖:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>${dynamic-datasource-spring-boot-starter.version}</version>
</dependency>

在application.yml配置文件中添加如下配置:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/master_db
    username: test
    password: test
  dynamic:
    datasource:
      datasource1:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/data_source_1
        username: test
        password: test
      datasource2:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/data_source_2
        username: test
        password: test
      primary: datasource1

在DataSource的配置类中添加注解@EnableDynamicDataSource:

@Configuration
@EnableDynamicDataSource
public class DynamicDataSourceConfiguration {
    @Bean
    @ConfigurationProperties("spring.datasource")
    public DataSource masterDataSource() {
        return new DruidDataSource();
    }

    @Bean
    @ConfigurationProperties("spring.dynamic.datasource.datasource1")
    public DataSource dataSource1() {
        return new DruidDataSource();
    }

    @Bean
    @ConfigurationProperties("spring.dynamic.datasource.datasource2")
    public DataSource dataSource2() {
        return new DruidDataSource();
    }

    @Bean
    @Primary
    public DataSource dataSource() {
        DynamicDataSource dynamicDataSource = new DynamicDataSource();
        dynamicDataSource.setDefaultTargetDataSource(masterDataSource());
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put("datasource1", dataSource1());
        targetDataSources.put("datasource2", dataSource2());
        dynamicDataSource.setTargetDataSources(targetDataSources);
        return dynamicDataSource;
    }
}

至此就实现了多数据源配置。

7. Spring Boot如何实现实时刷新配置?

在Spring Boot 2.x中,可以使用Spring Cloud Config推送、普通Spring Boot属性自动刷新、Spring Cloud Bus等方式来实现属性实时刷新的功能。

其中,使用Spring Cloud Bus进行动态刷新配置,需要依赖RabbitMQ或Kafka服务。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

同时,在需要刷新的类中添加注解@RefreshScope。例如:

@RestController
@RefreshScope
public class HelloController {
    @Value("${greet}")
    private String greet;

    @GetMapping("/hello")
    public String hello() {
        return greet;
    }
}

在代码中,通过@Value注解自动装配属性,并在GetMapping注解下添加上@RefreshScope注解,即可实现属性自动刷新。

8. Spring Boot如何实现定时任务?

利用Spring Boot内嵌集成的 Quartz框架和自带的 Scheduled Task机制,可以简单地实现定时任务。

以下是Spring Boot Schedule使用例子:

@Component
public class ScheduledTasks {
    @Scheduled(fixedRate = 5000)
    public void reportCurrentTime() {
        System.out.println("现在时间:" + new Date());
    }
}

以上代码,表示每五秒打印当前时间。

9. Spring Boot如何集成Mybatis?

使用Spring Boot的Mybatis Starter即可。它会自动地配置数据源、SqlSessionFactory、MapperScannerConfigurer三个bean,而且还会根据配置文件自动扫描所在的包路径。

添加以下依赖:

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>{mybatis-starter.version}</version>
</dependency>

在application.yml配置文件中添加如下配置:

mybatis:
    type-aliases-package: com.example.demo.pojo       #指定实体类的路径
    mapper-locations: classpath:mapper/*.xml          #指定mybatis的xml文件路径

10. Spring Boot如何集成Redis?

使用Redis Starter即可,Spring Boot会自动集成Jedis或Lettuce作为Redis客户端。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>${spring-boot.version}</version>
</dependency>

在application.yml配置文件中添加如下配置:

spring:
  redis:
    host: localhost
    port: 6379
    timeout: 10000
    password: test

11. Spring Boot如何实现缓存?

Spring Boot提供了多种缓存方式,如使用Ehcache、Redis等。缓存主要是通过 @EnableCaching 注解开启缓存支持,然后在方法上添加缓存注解比如@Cacheable等。

具体可以参考:

@EnableCaching
@Configuration
public class CacheConfiguration {

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofHours(1));
        return RedisCacheManager.builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
                .cacheDefaults(redisCacheConfiguration).build();
    }
}

@Service
public class UserServiceImpl implements UserService {

@Autowired
private UserRepository userRepository;

@Cacheable(value = "userCache", key = "#username")
public User findByUserName(String username) {
    return userRepository.findByUserName(username);
}

@CachePut(value = "userCache", key = "targetClass + methodName + #user.username")
public User save(User user) {
    return userRepository.save(user);
}

@CacheEvict(value = "userCache", key = "#id")
public void deleteById(Long id) {
    userRepository.deleteById(id);
}

}

在使用缓存操作时,在被调用的方法上添加 @Cacheable、@CachePut、@CacheEvict 等注解即可。

12. Spring Boot如何处理异常?

对于自定义异常,可以继承RuntimeException或者Exception;

  • RuntimeException:属于unchecked exception,可不用显式地在方法签名中说明抛出异常;
  • Exception:属于checked exception,必须在方法签名中说明该方法有可能抛出的异常。

在 configuration 包中新建一个 GlobalExceptionHandler 类,用于处理全局异常:

@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {

    private static Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    @ExceptionHandler(value = Exception.class)
    public Result errorHandler(Exception exception) {
        logger.error(exception.getMessage(), exception);
        if (exception instanceof BindException) {
            BindException bindException = (BindException) exception;
            FieldError fieldError = bindException.getFieldError();
            return Result.failure(fieldError.getDefaultMessage());
        } else if (exception instanceof MethodArgumentNotValidException) {
            MethodArgumentNotValidException methodArgumentNotValidException = 
                (MethodArgumentNotValidException) exception;
            BindingResult bindingResult = methodArgumentNotValidException.getBindingResult();
            FieldError fieldError = bindingResult.getFieldError();
            return Result.failure(fieldError.getDefaultMessage());
        } else {
            return Result.failure(CommonConstant.ERROR_CODE, exception.getMessage());
        }
    }
}

在上述代码中,@ControllerAdvice注解表示全局的Controller异常处理器,@ExceptionHandler注解表示具体的异常处理器,这里列举了几种常见异常的处理方式。

13. Spring Boot如何实现文件上传?

在pom.xml文件中添加如下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>${spring-boot.version}</version>
</dependency>

编写Controller控制器:

@RestController
@RequestMapping(value = "/")
public class FileUploadController {

    @PostMapping("/upload")
    public String handleFileUpload(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return "文件为空";
        }

        // 获取文件全名
        String originalFilename = file.getOriginalFilename();
        // 获取后缀名
        String suffixName = originalFilename.substring(originalFilename.lastIndexOf("."));

        // 自定义文件名称
        String fileName = UUID.randomUUID() + suffixName;

        // 文件路径+自定义文件名称
        String filePath = "D:/upload/" + fileName;

        try {
            // 存储到磁盘中
            file.transferTo(new File(filePath));
        } catch (Exception e) {
            e.printStackTrace();
            return "上传失败";
        }

        return "上传成功";
    }
}

在浏览器中输入如下地址:http://localhost:8080/upload.html,编写一个Html文件。如下:

```
<form method

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java经典面试题汇总:Spring Boot - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • Mybatis源码分析之插件模块

    “Mybatis源码分析之插件模块”是一篇深入剖析Mybatis插件模块的文章。总的来说,Mybatis插件模块的实现流程可以概括为下面四个核心类别:Interceptor、InterceptorChain、Plugin和Invocation。 Interceptor接口:插件必须实现的接口,提供了intercept()方法以便拦截Mybatis的方法调用。…

    Java 2023年6月1日
    00
  • SpringBoot关于自定义注解实现接口幂等性方式

    对于SpringBoot自定义注解实现接口幂等性,一般可以通过以下几个步骤来完成: 1. 创建幂等性注解 幂等性注解一般包含以下内容: 注解名称:一般用 @Idempotent 表示。 作用范围:一般有方法级别和参数级别两种。 验证方式:一般有请求参数和请求头两种。 具体实现示例: @Target({ElementType.METHOD, ElementTy…

    Java 2023年5月20日
    00
  • JAVA十大排序算法之基数排序详解

    JAVA十大排序算法之基数排序详解 基本概念 基数排序是按照低位先排序,也就是先排个位,再排十位,以此类推。这样从最低位开始排序,直到最高位排序完成之后,数列就变成了一个有序序列。 算法步骤 基数排序的过程可以描述如下: 取得数组中的最大数,并取得位数; arr为原始数组,从最低位开始取每个位组成radix数组; 对radix进行计数排序(利用计数排序适用于…

    Java 2023年5月19日
    00
  • 详解WebSocket+spring示例demo(已使用sockJs库)

    详解WebSocket+Spring示例Demo(已使用SockJS库) WebSocket是一种在Web浏览器和服务器之间进行全双工通信的协议。Spring框架提供了对WebSocket的支持,使得我们可以轻松地在Spring应用程序中实现WebSocket通信。本文将详细讲解如何使用Spring框架实现WebSocket通信,并提供两个示例说明。 1. …

    Java 2023年5月18日
    00
  • Spring mvc拦截器实现原理解析

    以下是关于“Spring MVC拦截器实现原理解析”的完整攻略,其中包含两个示例。 1. 前言 Spring MVC拦截器是一种常用的拦截器,它可以在请求到达控制器之前或之后执行一些操作。本攻略将详细讲解Spring MVC拦截器的实现原理。 2. 实现原理 Spring MVC拦截器的实现原理可以分为以下几个步骤: 2.1 拦截器注册 在Spring MV…

    Java 2023年5月16日
    00
  • java实现简易连连看小游戏

    Java实现简易连连看小游戏 介绍 连连看是一种受欢迎的消除类小游戏,它的基本思路是连接两个相同的图案,使它们在连接的路径上不超过两个转弯即可消除。在本项目中,我们将使用Java语言实现一个简化版的连连看小游戏。 实现步骤 1. 设计游戏界面 首先,我们需要设计游戏界面的布局和样式。可以使用Java Swing等图形库生成界面,并使用CSS样式表设置一些基本…

    Java 2023年5月19日
    00
  • Java Scala之面向对象

    Java Scala之面向对象:完整攻略 什么是面向对象 面向对象(Object Oriented Programming,简称OOP)是一种编程范式,主要思想是将数据和对数据的相关操作封装在一个单元中,形成对象。通过对对象的定义、组合和继承等机制实现程序的可扩展性、灵活性和可维护性。 面向对象的三大特征 封装(Encapsulation) 封装就是将程序中…

    Java 2023年5月26日
    00
  • Java web Hibernate如何与数据库链接

    Java web是一种使用Java编程语言开发web应用程序的技术,Hibernate是一种基于Java的ORM框架。Hibernate允许将Java类映射到关系数据库表,从而实现无需编写SQL语句的数据库操作。 下面是Java web Hibernate如何与数据库链接的攻略: 1. 配置Hibernate配置文件 在项目的src目录下创建一个名为hibe…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部