Springboot框架有关的面试题

为什么要有 SpringBoot?

Spring Boot是一个用于构建微服务的框架,它提供了一种快速、简单的方式来创建和部署独立的、基于Spring的应用程序。Spring Boot简化了Spring应用程序的开发和部署过程,提供了自动化配置、内嵌式容器和快速构建工具,使开发人员可以更加专注于业务逻辑的实现而不是繁琐的配置工作。

使用Spring Boot可以带来以下好处:

  1. 快速启动:Spring Boot提供了快速启动的能力,可以快速构建和启动应用程序,减少了开发和部署的时间成本。
  2. 自动配置:Spring Boot通过自动配置功能,可以根据应用程序的依赖和环境自动配置Spring应用程序,减少了开发人员对于配置的烦恼。
  3. 内嵌式容器:Spring Boot内置了多种容器(如Tomcat、Jetty等),可以将应用程序打包成可执行的JAR文件,无需额外的Web服务器。
  4. 微服务支持:Spring Boot支持构建微服务架构,提供了丰富的功能和组件,可以轻松构建和部署微服务应用。

因此,Spring Boot可以帮助开发人员快速构建、部署和管理Spring应用程序,提高了开发效率和应用程序的可维护性。

说出使⽤ Spring Boot 的主要优点

使用Spring Boot的主要优点包括:

  1. 简化开发:Spring Boot提供了自动配置和快速启动的功能,使开发人员可以快速构建应用程序,减少了繁琐的配置和部署过程。
  2. 内嵌式容器:Spring Boot内置了多种容器(如Tomcat、Jetty等),可以将应用程序打包成可执行的JAR文件,无需额外的Web服务器,简化了部署过程。
  3. 微服务支持:Spring Boot提供了丰富的功能和组件,可以轻松构建和部署微服务应用,支持微服务架构的开发。
  4. 自动化配置:Spring Boot可以根据应用程序的依赖和环境自动配置Spring应用程序,减少了开发人员对于配置的烦恼。
  5. 易于集成:Spring Boot集成了大量的第三方库和框架,可以轻松地与其他技术进行集成,如Spring Cloud、Spring Data等。
  6. 简化监控和管理:Spring Boot提供了丰富的监控和管理功能,可以方便地监控应用程序的运行状态和性能指标。

总的来说,Spring Boot简化了Spring应用程序的开发、部署和管理过程,提高了开发效率和应用程序的可维护性,是构建现代化、高效的Java应用程序的理想选择。

什么是 Spring Boot Starters?

Spring Boot Starters是Spring Boot提供的一种依赖管理方式,它可以帮助开发人员快速集成和使用Spring Boot的各种功能和组件。Starters是一组预定义的依赖项集合,包含了一组相关的依赖项,可以方便地引入到应用程序中,减少了开发人员对于依赖项的管理和配置。

Spring Boot Starters通常包含了以下内容:

  1. Spring Boot自动配置:包含了自动配置的代码,可以根据应用程序的依赖和环境自动配置Spring应用程序。
  2. Spring框架依赖项:包含了Spring框架的核心依赖项,如Spring MVC、Spring Data等。
  3. 第三方库和组件:包含了第三方库和组件的依赖项,如数据库驱动程序、消息队列客户端等。

使用Spring Boot Starters可以帮助开发人员快速集成和使用Spring Boot的各种功能和组件,减少了开发人员对于依赖项的管理和配置,提高了开发效率和应用程序的可维护性。

Spring Boot ⽀持哪些内嵌 Servlet 容器?

Spring Boot支持以下内嵌Servlet容器:

  1. Tomcat:Spring Boot默认的内嵌Servlet容器就是Tomcat。它是一个流行的开源Servlet容器,支持Java Servlet、JSP等。
  2. Jetty:Spring Boot也支持Jetty作为内嵌Servlet容器。Jetty是一个轻量级的Servlet容器,适合于嵌入式应用程序。
  3. Undertow:Spring Boot还支持Undertow作为内嵌Servlet容器。Undertow是一个高性能的Servlet容器,由JBOSS开发。

通过Spring Boot的自动配置功能,开发人员可以轻松地切换这些内嵌Servlet容器,而无需进行额外的配置。这使得开发人员可以根据应用程序的需求选择合适的内嵌Servlet容器,而无需担心与Spring Boot集成的问题。

如何在 Spring Boot 应⽤程序中使⽤ Jetty ⽽不是 Tomcat?

在Spring Boot应用程序中使用Jetty而不是Tomcat非常简单,可以通过以下步骤实现:

  1. 添加Jetty依赖:在项目的pom.xml文件中,将Tomcat的依赖排除,并添加Jetty的依赖。例如:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
  1. 禁用Tomcat的自动配置:在Spring Boot应用程序的主类中,使用@SpringBootApplication注解的exclude属性来禁用Tomcat的自动配置。例如:
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;

@SpringBootApplication(exclude = {ServletWebServerFactoryAutoConfiguration.class})
public class MyApplication {

    public static void main(String[] args) {
        new SpringApplicationBuilder(MyApplication.class).run(args);
    }

    @Bean
    public ServletWebServerFactory servletContainer() {
        JettyServletWebServerFactory factory = new JettyServletWebServerFactory();
        return factory;
    }
}

通过上述步骤,就可以在Spring Boot应用程序中使用Jetty而不是Tomcat作为内嵌Servlet容器。这样做可以根据应用程序的需求选择合适的内嵌Servlet容器,而无需担心与Spring Boot集成的问题。

介绍⼀下@SpringBootApplication 注解

@SpringBootApplication是一个Spring Boot提供的注解,它结合了以下三个注解的功能:

  1. @Configuration:标识该类是一个配置类,可以通过Java配置来配置Spring的Bean。
  2. @ComponentScan:启用组件扫描,自动扫描并加载符合条件的组件,包括@Service、@Repository、@Controller等。
  3. @EnableAutoConfiguration:开启Spring Boot的自动配置功能,根据项目的依赖和环境自动配置Spring应用程序。

因此,通过在Spring Boot应用程序的主类上使用@SpringBootApplication注解,可以实现以下功能:

  1. 标识该类是Spring Boot应用程序的入口类。
  2. 启用Spring Boot的自动配置功能,根据应用程序的依赖和环境自动配置Spring应用程序。
  3. 启用组件扫描,自动扫描并加载符合条件的组件。

使用@SpringBootApplication注解可以大大简化Spring Boot应用程序的配置,并且是Spring Boot应用程序的入口点。通常情况下,我们会将@SpringBootApplication注解放在Spring Boot应用程序的主类上,以便启动Spring Boot应用程序。

Spring Boot 的⾃动配置是如何实现的?

Spring Boot的自动配置是通过以下几个关键机制来实现的:

  1. 条件化配置:Spring Boot使用条件化配置来根据应用程序的环境和依赖自动配置Spring应用程序。这是通过@ConditionalOnClass@ConditionalOnMissingClass@ConditionalOnBean@ConditionalOnMissingBean等条件注解来实现的。这些条件注解可以根据类的存在与否、Bean的存在与否等条件来决定是否应用某个配置。
  2. 类路径扫描:Spring Boot会自动扫描应用程序的类路径,发现并加载符合条件的配置类。这些配置类可以通过@Configuration@Component等注解来标识。
  3. 外部化配置:Spring Boot支持外部化配置,可以通过属性文件、YAML文件、环境变量等方式来配置应用程序。Spring Boot会自动加载并应用这些外部化配置,根据配置来决定是否启用某些功能。
  4. 自动装配:Spring Boot会根据应用程序的依赖自动装配Spring应用程序所需的Bean。这是通过@EnableAutoConfiguration注解和Spring Boot的自动配置模块来实现的。Spring Boot会根据应用程序的依赖自动配置适当的Bean,例如数据源、JPA、Web服务器等。

通过这些机制,Spring Boot可以根据应用程序的环境和依赖自动配置Spring应用程序,大大简化了Spring应用程序的配置工作。开发人员无需手动配置大量的Bean和组件,而是可以依赖Spring Boot的自动配置来快速搭建应用程序的基础设施。同时,开发人员也可以通过自定义条件化配置、自定义配置类等方式来扩展和定制Spring Boot的自动配置。

开发 RESTful Web 服务常⽤的注解有哪些?

开发RESTful Web服务时,常用的注解包括:

  1. @RestController:标识一个类为RESTful风格的控制器,通常用于处理HTTP请求并返回JSON、XML等格式的数据。
  2. @RequestMapping:用于将HTTP请求映射到控制器的处理方法,可以指定请求的URL、请求方法、请求参数等。
  3. @GetMapping@PostMapping@PutMapping@DeleteMapping:这些注解分别对应HTTP的GET、POST、PUT、DELETE请求,用于简化对应请求方法的映射。
  4. @PathVariable:用于将URL中的模板变量映射到方法的参数上,通常用于RESTful风格的URL中。
  5. @RequestParam:用于将请求参数映射到方法的参数上,可以指定参数名、是否必需等属性。
  6. @RequestBody:用于将HTTP请求的body部分映射到方法的参数上,通常用于接收JSON或XML格式的请求数据。
  7. @ResponseBody:用于将方法的返回值直接作为HTTP响应的body部分返回,通常用于返回JSON或XML格式的数据。
  8. @ResponseStatus:用于指定方法的HTTP响应状态码。
  9. @CrossOrigin:用于处理跨域请求,允许指定的域名访问该接口。

这些注解可以帮助开发者快速地编写RESTful风格的Web服务,简化了对HTTP请求和响应的处理。通过合理使用这些注解,可以使代码更加清晰、简洁,并且符合RESTful的设计原则。

Spirng Boot 常⽤的两种配置⽂件

Spring Boot常用的两种配置文件是:

  1. src/main/resources/application.properties:这是一个基于键值对的配置文件,用于配置应用程序的各种属性。可以在这里配置数据库连接信息、服务器端口、日志级别、国际化配置等。示例配置:

    server.port=8080
    spring.datasource.url=jdbc:mysql://localhost:3306/mydb
    logging.level.org.springframework=DEBUG
    
  2. src/main/resources/application.yml:这是一个基于YAML格式的配置文件,相比于application.properties更加易读和易写。同样用于配置应用程序的各种属性。示例配置:

    server:
      port: 8080
    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/mydb
    logging:
      level:
        org.springframework: DEBUG
    

这两种配置文件都可以用来配置Spring Boot应用程序的属性,开发者可以根据个人喜好和项目需求选择合适的配置文件格式。在实际开发中,通常会根据需求结合使用这两种配置文件,比如将一些基本的属性配置在application.properties中,将复杂的配置结构化地配置在application.yml中。

什么是 YAML?YAML 配置的优势在哪⾥ ?

YAML(YAML Ain’t Markup Language)是一种人类可读的数据序列化格式,通常用于配置文件、数据传输等场景。YAML使用缩进和换行来表示数据结构,具有简洁、易读、易写的特点。YAML配置的优势包括:

  1. 易读性:YAML使用缩进和换行来表示数据结构,使得配置文件的结构清晰、易读。相比于JSON和XML等格式,YAML更加接近自然语言,减少了配置文件的冗余符号,使得配置文件更加清晰易懂。
  2. 易写性:YAML采用了简洁的语法,减少了冗余的符号和标记,使得配置文件编写起来更加简洁、高效。相比于XML等格式,YAML的语法更加简洁,减少了编写和维护配置文件的工作量。
  3. 结构化:YAML支持多种数据类型(如字符串、整数、浮点数、布尔值、数组、对象等),并且可以通过缩进的方式表示嵌套结构,使得配置文件可以以更加结构化的方式来组织数据。
  4. 易扩展:YAML支持注释,可以提供对配置信息的说明,便于他人理解和维护。同时,YAML也支持引用和继承等特性,使得配置文件可以更加灵活地组织和管理数据。

总的来说,YAML配置文件具有清晰、简洁、易读、易写的特点,适合用于配置复杂的数据结构和格式化的文本数据。在Spring Boot等项目中,YAML配置文件通常用于配置应用程序的属性、数据源、日志级别等信息。

Spring Boot 常⽤的读取配置⽂件的⽅法有哪些?

Spring Boot常用的读取配置文件的方法包括:

  1. 使用@Value注解:可以通过在Spring组件中使用@Value注解来直接注入配置文件中的属性值。示例:

    @Value("${myapp.property}")
    private String myProperty;
    
  2. 使用@ConfigurationProperties注解:可以通过在配置类中使用@ConfigurationProperties注解来绑定配置文件中的属性值。示例:

    @Component
    @ConfigurationProperties(prefix = "myapp")
    public class MyProperties {
        private String property;
        // getter and setter
    }
    
  3. 使用Environment接口:可以通过在Spring组件中注入Environment接口来获取配置文件中的属性值。示例:

    @Autowired
    private Environment env;
    
    public void someMethod() {
        String property = env.getProperty("myapp.property");
    }
    
  4. 使用@PropertySource注解:可以通过在配置类上使用@PropertySource注解来指定加载的配置文件,然后通过@Value注解或Environment接口来读取属性值。示例:

    @Configuration
    @PropertySource("classpath:myapp.properties")
    public class MyConfig {
        // ...
    }
    

这些方法可以根据实际情况选择使用,通常情况下,推荐使用@ConfigurationProperties注解来将配置文件中的属性值绑定到JavaBean中,这样可以更好地组织和管理配置信息。同时,@Value注解和Environment接口也可以用于简单的属性读取。

Spring Boot 加载配置⽂件的优先级了解么?

Spring Boot 加载配置文件的优先级遵循以下顺序:

  1. 内嵌默认值:Spring Boot内置了一些默认的配置值,这些值会被直接加载到应用程序中作为默认配置。
  2. 命令行参数:可以通过命令行参数来覆盖默认的配置值,例如java -jar myapp.jar --myapp.property=value
  3. 外部配置文件:Spring Boot会按照特定的顺序加载外部的配置文件,包括application.propertiesapplication.ymlapplication-{profile}.propertiesapplication-{profile}.yml等。
  4. 环境变量:可以通过环境变量来覆盖配置文件中的属性值,例如export MYAPP_PROPERTY=value
  5. 配置中心:Spring Boot还支持集成配置中心(如Spring Cloud Config),可以将配置文件存储在远程的配置中心,并通过远程配置中心来管理和加载配置。

总的来说,Spring Boot加载配置文件的优先级是从内置默认值开始,然后依次加载命令行参数、外部配置文件、环境变量和配置中心,后面加载的配置会覆盖前面加载的配置。这种优先级的设计使得配置信息可以灵活地管理和覆盖,适应了不同环境和需求的配置变化。

常⽤的 Bean 映射⼯具有哪些?

常用的Bean映射工具包括:

  1. MapStruct:MapStruct是一个基于注解的Java Bean映射工具,它能够根据接口定义自动生成映射代码,提供了高性能的映射实现。使用MapStruct可以简化Bean之间的映射工作,提高开发效率。
  2. ModelMapper:ModelMapper是一个功能强大的Java Bean映射工具,它提供了丰富的映射配置选项,支持复杂的映射场景,并且具有灵活的转换规则。ModelMapper可以帮助开发人员快速、方便地进行Bean之间的映射转换。
  3. Dozer:Dozer是一个开源的Java Bean映射工具,它支持XML和注解两种配置方式,能够处理复杂的对象映射关系。Dozer提供了丰富的转换规则和映射配置选项,适用于各种复杂的映射场景。
  4. Orika:Orika是一个高性能的Java Bean映射工具,它能够自动进行Bean之间的映射转换,支持复杂对象的映射关系,并且具有较低的映射成本。Orika可以帮助开发人员简化Bean映射的编写工作,提高系统性能。

这些Bean映射工具都能够帮助开发人员简化Bean之间的映射转换工作,提高开发效率,降低开发成本。选择合适的Bean映射工具取决于项目的需求、复杂度和性能要求。

Spring Boot 如何监控系统实际运⾏状况?

Spring Boot 提供了多种方式来监控系统的实际运行状况,包括:

  1. Actuator:Spring Boot Actuator是Spring Boot提供的监控和管理应用程序的扩展功能,可以通过HTTP端点暴露应用程序的运行时信息,包括健康状况、内存使用、线程情况、日志级别等。通过Actuator,可以方便地监控应用程序的运行状态,并且可以自定义扩展端点。
  2. Spring Boot Admin:Spring Boot Admin是一个针对Spring Boot应用程序的监控和管理工具,它提供了Web界面来展示应用程序的运行状态、配置信息、日志等,并且支持告警和通知功能。Spring Boot Admin可以方便地监控多个Spring Boot应用程序的运行状况。
  3. Metrics监控:Spring Boot集成了Micrometer库,可以方便地收集应用程序的性能指标数据,并将这些数据暴露给监控系统。可以使用各种监控系统(如Prometheus、Grafana等)来展示这些指标数据,从而监控应用程序的性能和运行状况。
  4. 日志监控:Spring Boot内置了Logback和Log4j等日志框架,可以通过配置来记录应用程序的日志,包括访问日志、错误日志等。通过监控和分析日志,可以了解应用程序的运行情况和异常情况。

以上这些方式都可以帮助开发人员监控Spring Boot应用程序的运行状况,及时发现问题并进行处理。根据项目的需求和实际情况,可以选择合适的监控方式来监控系统的实际运行状况。

Spring Boot 如何做请求参数校验?

Spring Boot 提供了多种方式来进行请求参数校验,其中最常用的是使用 Hibernate Validator 和 Spring 的校验注解。以下是一种常见的做法:

  1. 引入依赖:首先在Maven或Gradle项目中引入 Hibernate Validator 的依赖,Spring Boot 2.x 默认已经包含了 Hibernate Validator,因此无需额外引入。
  2. 在实体类中添加校验注解:在需要校验的实体类的字段上使用 Hibernate Validator 提供的校验注解,例如 @NotNull@Size@Email 等。例如:
public class User {
    @NotNull
    private String username;

    @Email
    private String email;

    // 其他字段...
}
  1. 在Controller中进行参数校验:在需要校验参数的 Controller 方法中,使用 @Valid 注解标记需要校验的实体类参数,并在方法参数中添加 BindingResult 参数来接收校验结果。例如:
@RestController
public class UserController {
    @PostMapping("/users")
    public ResponseEntity<String> createUser(@Valid @RequestBody User user, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            // 处理校验失败的情况
            return ResponseEntity.badRequest().body("参数校验失败");
        }
        // 校验通过,继续处理逻辑
        return ResponseEntity.ok("用户创建成功");
    }
}

在上述例子中,@Valid 注解用于告诉Spring对 User 对象进行校验,校验结果将会存储在 BindingResult 对象中。

通过以上步骤,就可以在Spring Boot应用中使用Hibernate Validator进行请求参数的校验。当请求参数不符合校验规则时,校验结果会存储在 BindingResult 对象中,开发人员可以根据校验结果进行相应的处理。

如何使⽤ Spring Boot 实现全局异常处理?

在Spring Boot中,可以通过@ControllerAdvice注解来实现全局异常处理。以下是实现全局异常处理的步骤:

  1. 创建一个全局异常处理类,并使用@ControllerAdvice注解标记该类。这个类可以包含多个用@ExceptionHandler注解标记的方法,每个方法处理不同类型的异常。
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleException(Exception e) {
        // 处理所有类型的异常
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Internal Server Error");
    }

    @ExceptionHandler(MyCustomException.class)
    public ResponseEntity<String> handleCustomException(MyCustomException e) {
        // 处理自定义的异常
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage());
    }
}
  1. 在@ExceptionHandler注解标记的方法中,可以根据不同类型的异常进行相应的处理,并返回合适的HTTP状态码和错误信息。
  2. 在处理异常的方法中,可以根据需要进行日志记录、发送告警通知等操作。

通过以上步骤,就可以在Spring Boot应用中实现全局异常处理。当发生异常时,会根据异常类型调用对应的处理方法,并返回相应的HTTP状态码和错误信息。这样可以统一处理应用程序中的异常情况,提高系统的健壮性和可维护性。

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

在Spring Boot中,可以通过使用@Scheduled注解来实现定时任务。以下是实现定时任务的步骤:

  1. 在Spring Boot应用的任意一个Bean方法上添加@Scheduled注解,并设置定时任务的触发条件。例如,可以设置定时任务每隔一段时间执行,或者在特定的时间点执行。
@Service
public class MyScheduledTask {

    @Scheduled(fixedRate = 5000) // 每隔5秒执行一次
    public void myTask() {
        // 定时任务的逻辑
        System.out.println("定时任务执行了");
    }
}
  1. @SpringBootApplication注解标记的启动类上添加@EnableScheduling注解,以启用Spring的定时任务功能。
@SpringBootApplication
@EnableScheduling
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

通过以上步骤,就可以在Spring Boot应用中实现定时任务。定时任务的逻辑会按照@Scheduled注解中设置的条件执行,可以根据需求来设置不同的触发条件。这样可以方便地在Spring Boot应用中实现定时任务,例如定时数据清理、定时报表生成等功能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值