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日

相关文章

  • 一文详解Spring构造函数推断

    一文详解Spring构造函数推断 在使用Spring Framework进行Java开发时,构造函数推断是一个重要的特性。本文将介绍什么是构造函数推断,为什么需要它,以及如何使用它。 什么是构造函数推断? 构造函数推断是Spring Framework的一个特性,它可以自动推断应该使用哪个构造函数来实例化一个 bean。以前,我们需要显式地在XML或Java…

    Java 2023年5月26日
    00
  • SpringBoot入口类和@SpringBootApplication讲解

    Spring Boot是Spring框架的一个扩展,旨在通过提供默认的配置和简化特定的Spring应用程序的配置来减少初始配置工作。 Spring Boot提供了一个非常简单的方式来开发独立的,生产级别的Spring应用程序。 Spring Boot的核心是应用程序的入口类,注解@SpringBootApplication是主要的组件解析器。 SpringB…

    Java 2023年5月15日
    00
  • 使用idea创建web框架和配置struts的方法详解

    使用IDEA创建Web框架 第一步:创建项目 在IDEA的欢迎界面中,选择 “Create New Project”,进入项目创建页面。选择 “Java Enterprise” 类型,然后按照向导一步一步创建项目。 第二步:添加Web框架 完成项目创建后,在项目的 “pom.xml” 中添加 Web 框架的依赖。具体可以在 Maven Central 仓库中…

    Java 2023年5月20日
    00
  • java实现可安装的exe程序实例详解

    Java实现可安装的exe程序实例详解 在本文中,我们将详细讲解如何使用Java实现可安装的exe程序,并提供两个示例来进一步说明。 1. 准备工作 在开始之前,我们需要准备以下工具: Gradle:用于构建项目和打包工具 Launch4j:用于将Java程序打包成可执行的exe程序 2. 构建项目 我们使用Gradle工具来构建项目。首先,在你的项目根目录…

    Java 2023年5月23日
    00
  • Java实现的求逆矩阵算法示例

    Java实现的求逆矩阵算法示例 什么是逆矩阵 矩阵A的逆矩阵记为A-1,它是一个与A相乘后得到单位矩阵的矩阵。在一般的情况下,只有方阵才有逆矩阵。 矩阵求逆算法 对于一个n阶方阵A,它的行列式为det(A)。 如果det(A)不等于0,则A可逆,它的逆矩阵B为: B = 1/det(A) * adj(A) 其中,adj(A)是A的伴随矩阵,它是由矩阵A的每个…

    Java 2023年5月19日
    00
  • Jvisualvm监控远程SpringBoot项目的过程详解

    以下是“JVisualVM监控远程SpringBoot项目的过程详解”的完整攻略: 简介 JVisualVM是Java虚拟机监视器和性能分析工具的图形化界面,它提供了一组用于分析Java应用程序运行的工具,包括CPU和堆剖析,线程和类查看器,GC鉴定工具等等,可以方便地监控Java应用的性能,分析应用的性能瓶颈。 Spring Boot为开发者提供了一种更简…

    Java 2023年5月20日
    00
  • JavaWeb中使用JavaMail实现发送邮件功能实例详解

    下面我将为你详细讲解“JavaWeb中使用JavaMail实现发送邮件功能实例详解”的完整攻略。 1. 前置技能 在使用JavaMail之前你需要具备以下知识: Java基础知识:Java语法、类、对象、方法、接口、异常、集合框架等 SMTP/POP3协议:SMTP是发送邮件的协议,POP3是接收邮件的协议,具体可以通过网络搜索或者参考相关文档进行了解 2.…

    Java 2023年6月15日
    00
  • 详解Mysql如何实现数据同步到Elasticsearch

    如何实现MySQL数据同步到Elasticsearch?本文将为大家提供一种常见的实现方法,即使用Logstash工具来实现同步。具体步骤如下: 步骤一:安装Logstash 首先,我们需要安装Logstash,它是一个开源的数据处理工具,可以将各种形式的数据发送到Elasticsearch。可以通过以下方式安装: wget https://artifact…

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