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日

相关文章

  • maven配置阿里仓库的方法步骤

    Maven 是一款开源项目建构工具,可以帮助我们更方便地构建、管理和发布项目。默认情况下,Maven 会从 Maven 官方仓库中下载依赖,但是有时候官方仓库的下载速度会受制于网络环境,因此我们需要配置Maven访问阿里仓库以加速依赖的下载。 以下是 Maven 配置阿里仓库的方法步骤: 1. 打开 Maven 的配置文件 Maven 的配置文件为 sett…

    Java 2023年5月20日
    00
  • 详解手把手Maven搭建SpringMVC+Spring+MyBatis框架(超级详细版)

    详解手把手Maven搭建SpringMVC+Spring+MyBatis框架(超级详细版) 本文将详细讲解如何使用Maven搭建SpringMVC+Spring+MyBatis框架,并提供两个示例说明。 环境准备 在开始搭建框架之前,我们需要准备以下环境: JDK 1.8或以上版本 Maven 3.6.3或以上版本 Tomcat 9.0或以上版本 MySQL…

    Java 2023年5月17日
    00
  • 如何使用动态字节码生成框架?

    使用动态字节码生成框架可以通过编写Java代码来动态生成字节码,从而在运行时生成类并加载。它可以用于动态地创建类、修改和替换类方法、篡改类的属性等场景。常用的动态字节码生成框架包括ASM、Javassist、ByteBuddy等。 以下是使用ASM和Javassist两个框架的使用攻略: 使用ASM生成动态字节码 步骤一:创建一个ClassWriter实例 …

    Java 2023年5月11日
    00
  • Spring Boot面试必问之启动流程知识点详解

    下面我将为你详细讲解Spring Boot中启动流程的相关知识点。 1. Spring Boot应用启动原理 Spring Boot的应用启动依赖于Spring框架,其启动过程是基于Spring框架的启动过程进行的。在Spring Boot应用启动过程中,主要包含以下步骤: 加载Spring Boot应用的配置信息; 创建Spring应用上下文Applica…

    Java 2023年5月19日
    00
  • 使用Post方式提交数据到Tomcat服务器的方法

    当我们需要向服务器发送数据并处理时,可以使用HTTP协议中的POST请求来将数据发送给服务器。下面介绍如何使用Post方式提交数据到Tomcat服务器的方法。 前置知识 基本的HTML表单概念和语法。 Tomcat服务器基本概念和配置启动方法。 了解HTTP协议。 步骤 以下为使用Post方式提交数据到Tomcat服务器的步骤: 1. 编写HTML表单 首先…

    Java 2023年5月19日
    00
  • 更简单更高效的Mybatis Plus最新代码生成器AutoGenerator

    下面是“更简单更高效的Mybatis Plus最新代码生成器AutoGenerator”的完整攻略: 什么是Mybatis Plus代码生成器? Mybatis Plus是Mybatis框架的一个增强工具,提供了更多的SQL语句操作方法和强大的代码生成器。Mybatis Plus代码生成器(AutoGenerator)是其中的一个强大的功能,可以帮助我们快速…

    Java 2023年5月20日
    00
  • Eclipse中配置Maven的图文教程

    下面是Eclipse中配置Maven的详细攻略: 步骤一:下载安装Maven 首先,我们需要下载并安装Maven,这里我们推荐使用Apache Maven官方网站提供的二进制版本。以下是下载Maven的步骤: 访问官方网站:https://maven.apache.org/download.cgi 选择最新的二进制版本进行下载。 下载完成后,解压到本地某个目…

    Java 2023年5月19日
    00
  • Java读取、写入文件如何解决乱码问题

    当我们使用Java读取、写入文件时,由于文件码表不同,可能会出现乱码问题。解决乱码问题可以从以下两个方面入手: 设置读写文件的字符集为UTF-8 Java应该尽量使用UTF-8编码来处理文本文件。为此,我们可以通过使用Java API提供的InputStreamReader和OutputStreamWriter来指定字符集为UTF-8。 示例一:读取文件时指…

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