springboot常见面试题

1 为什么要springboot?springboot跟spring的区别

Spring Boot是一个开源Java-based框架,用于创建微服务。它是由Pivotal团队创建的,用于快速开发生产级的Spring应用。Spring Boot让你可以不用或者只需要很少的Spring配置就能创建一个应用。

与Spring Framework相比,Spring Boot具有以下特点:

  1. 自动配置:Spring Boot可以根据在类路径上的jar依赖自动配置你的应用。例如,如果在类路径上检测到HSQLDB,则Spring Boot会自动配置内存数据库。你不需要编写配置代码。

  2. 开箱即用:Spring Boot内置了应用服务器(例如Tomcat),所以你可以直接运行应用。你不需要部署war文件。

  3. 生产准备的特性:Spring Boot具有内置的功能,例如健康检查和指标,这可以帮助你监控和管理生产应用。

  4. 无代码生成:Spring Boot不生成代码,绝对没有任何代码生成,也没有xml配置文件。

与Spring Framework相比,Spring Boot具有以下优势:

  1. 简化配置:Spring Boot通过自动配置和提供默认值,简化了Spring应用的配置。

  2. 快速开发:Spring Boot内置了很多模板代码和库,可以帮助你快速开发新的功能。

  3. 微服务准备:Spring Boot适合微服务的开发,因为它可以轻松地开发和部署独立的服务。

  4. 集成Spring生态系统:Spring Boot与Spring Data、Spring Security、Spring Batch等项目完美集成。

总之,Spring Boot让Spring应用的开发变得更加简单、快速和方便。对于Spring的开发者来说,Spring Boot是一个非常有用的工具。

2 springboot跟springcloud的区别

Spring Boot和Spring Cloud都是Spring的项目,但它们的关注点和用途有所不同。

  1. 目标

    • Spring Boot 的主要目标是简化Spring应用的创建和开发过程。它提供了一种新的方式来创建Spring应用,包括自动配置、生产就绪的功能和开箱即用的依赖管理。
    • Spring Cloud 的目标是为开发者提供一些常见的模式用于构建分布式系统。它是一个工具集,用于帮助开发者在云计算环境中快速构建分布式应用。
  2. 功能

    • Spring Boot 提供了创建独立的Spring应用的方式。它可以帮助你快速启动、开发和运行Spring应用。它可以自动配置你的Spring应用,生产准备级的应用监控,集成了大量常用的第三方库配置。
    • Spring Cloud 提供了一系列用于处理分布式系统中常见问题的解决方案。例如,它提供了服务发现(Service Discovery)、配置管理(Configuration Management)、路由(Routing)、负载均衡(Load Balancing)等功能。
  3. 使用场景

    • Spring Boot 通常用于构建单体应用或微服务,无论是Web应用还是后台服务。
    • Spring Cloud 主要用于构建大型的分布式系统,通常是微服务架构的应用。它是建立在Spring Boot的基础上的,它用于简化分布式系统中的一些常见模式。
  4. 依赖关系

    • Spring Boot 是一个独立的项目,它可以不依赖于其他Spring项目。
    • Spring Cloud 是建立在Spring Boot的基础上的,它使用Spring Boot来创建微服务并提供与云相关的功能。

总之,Spring Boot和Spring Cloud是为不同目的而设计的。Spring Boot是为了简化Spring应用的开发,而Spring Cloud是为了简化分布式系统的开发。如果你在开发一个分布式系统,你通常会同时使用这两个项目。

3 springboot的常用注解

Spring Boot提供了许多注解来简化Spring应用的配置和开发。以下是一些常用的注解:

  1. @SpringBootApplication:标注一个主程序类,说明这是一个Spring Boot应用。

  2. @ComponentScan:自动扫描并加载符合条件的组件或bean,将它们注册到容器(applicationContext)中。

  3. @Configuration:声明当前类是一个配置类,用于替代XML配置文件。

  4. @Bean:将一个方法的返回值注入到Spring容器。

  5. @Autowired:自动注入Spring容器中的bean。

  6. @Component:泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

  7. @Service:标注在服务类上,表示这是一个业务逻辑类。

  8. @Controller:标注在控制器类上,表示这是一个Spring MVC控制器。

  9. @RestController:标注在控制器类上,表示这是一个Spring MVC控制器,且返回的数据默认为JSON格式。

  10. @RequestMapping:处理请求地址映射,用于类或方法上。该注解可以标明一个URL到类或方法的映射。

  11. @GetMapping, @PostMapping, @PutMapping, @DeleteMapping:处理详细的HTTP请求类型映射。

  12. @PathVariable:用于获取路径变量。

  13. @RequestParam:用于获取查询参数。

  14. @RequestBody:用于获取请求体内容。

  15. @ResponseBody:用于指定一个方法返回的结果直接写入HTTP响应正文中。

  16. @Value:注入配置文件中的属性。

  17. @Profile:指定组件在哪个环境下才能被注册到容器中。

  18. @PropertySource:加载指定的配置文件。

  19. @EnableAutoConfiguration:启用自动配置。

这些注解在Spring Boot应用开发中被广泛使用,可以极大地简化Spring应用的配置和开发。

4 springboot starter启动过程

4.1 概述

Spring Boot Starter是Spring Boot项目的一个核心概念。一个Starter是一个预配置的模板,它包含了一个或多个JAR依赖,以及可能的自动配置。它们的目的是简化Spring Boot应用的配置和开发过程。

以下是Spring Boot启动过程的一般步骤:

  1. 初始化Spring应用上下文:Spring Boot启动过程的第一步是创建一个Spring应用上下文,该上下文包含了应用中所有的Bean定义。

  2. 加载Spring Boot Starter依赖:Spring Boot会加载在项目中声明的所有Starter依赖。Starter是一种特殊的Spring Boot模块,它包含了一组有用的默认配置、JAR依赖和自动配置的代码。

  3. 加载应用属性 :Spring Boot会加载应用的属性配置文件,如application.propertiesapplication.yml。这些文件包含了应用的各种配置信息。

  4. 执行自动配置 :Spring Boot会执行自动配置的过程。这是通过@EnableAutoConfiguration注解完成的。自动配置会扫描应用上下文中的Bean,然后基于应用的配置和依赖自动配置Spring Bean。

  5. 创建并初始化Bean:在自动配置阶段之后,Spring Boot会创建并初始化应用上下文中的所有Bean。这些Bean包括应用中的所有组件、服务、控制器等。

  6. 启动内嵌的Web服务器:如果应用是一个Web应用,Spring Boot会启动一个内嵌的Web服务器(默认是Tomcat)来处理HTTP请求。

  7. 启动Spring应用 :最后,Spring Boot会启动Spring应用。这通常是通过调用SpringApplication.run()方法完成的。该方法会启动Spring应用并返回一个Spring应用上下文。

  8. 运行应用:应用现在已经启动并运行。它可以接受和处理HTTP请求,执行业务逻辑,访问数据库等。

总之,Spring Boot启动过程涉及初始化Spring应用上下文、加载Starter依赖、加载应用属性、执行自动配置、创建和初始化Bean、启动内嵌的Web服务器等步骤。这个过程简化了Spring应用的配置和开发过程,并使得Spring应用的启动变得更加快速和简单。

4.2 执行"自动配置"和"创建并初始化Bean"有什么区别"?

执行自动配置和创建并初始化Bean这两个步骤在Spring Boot应用启动过程中都是非常重要的,它们有不同的职责和作用:

  1. 执行自动配置 :这个步骤主要是为了自动配置Spring应用上下文中的Bean。自动配置是Spring Boot的一个重要特性,它可以根据应用的配置和依赖自动配置一些常见的Bean,如数据源、Web服务器、模板引擎等。这个过程是通过@EnableAutoConfiguration注解完成的。自动配置会扫描应用上下文中的Bean和配置,然后根据这些信息自动配置一些常见的Bean。这样可以简化应用的配置,让开发者更加专注于业务逻辑的开发。

  2. 创建并初始化Bean:这个步骤主要是为了创建和初始化Spring应用上下文中的所有Bean。这些Bean包括应用中的所有组件、服务、控制器等。这个过程是在自动配置阶段之后进行的。Spring会根据Bean的定义和依赖关系创建并初始化Bean,然后将这些Bean注入到应用中需要的地方。这个过程是Spring IoC(控制反转)容器的核心功能。

总之,执行自动配置和创建并初始化Bean这两个步骤有不同的职责和作用。执行自动配置主要是为了自动配置一些常见的Bean,spring.factories文件中的bean,而创建并初始化Bean主要是为了创建和初始化应用上下文中的所有Bean,指的是处理beanDefinitionMap中的bean元数据,即我们程序员自己写的@Componnet等注解标注的类。这两个步骤都是Spring Boot应用启动过程中非常重要的。

4.3 执行自动配置主要是为了自动配置一些常见的Bean,spring.factories文件中的bean,而创建并初始化Bean主要是为了创建和初始化应用上下文中的所有Bean,指的是处理beanDefinitionMap中的bean元数据,即我们程序员自己写的@Componnet等注解标注的类,对吗?

是的,你的理解是正确的:

  1. 执行自动配置 :主要是为了自动配置一些常见的Bean。这个过程是通过spring.factories文件中的配置来完成的。在这个文件中,Spring Boot列出了一些自动配置的类。当应用启动时,Spring Boot会自动加载这些类,并根据应用的配置和依赖自动配置一些常见的Bean。这些Bean通常是一些基础设施的组件,如数据源、Web服务器、模板引擎等。

  2. 创建并初始化Bean :主要是为了创建和初始化应用上下文中的所有Bean。这个过程包括处理beanDefinitionMap中的Bean元数据,以及根据这些元数据创建和初始化Bean。这些Bean包括我们程序员自己写的@Component@Service@Controller@Repository等注解标注的类,以及其他一些通过XML配置或Java配置定义的Bean。

这两个步骤都是Spring Boot应用启动过程中非常重要的。执行自动配置主要是为了简化应用的配置,而创建并初始化Bean主要是为了初始化应用上下文中的所有Bean,这两个步骤都是Spring IoC(控制反转)容器的核心功能。

5 @autowire和@resource

5.1 @autowire和@resource注解是springboot中的注解吗

@Autowired@Resource 注解都不是 Spring Boot 特有的,它们都来自于 Spring 框架本身。Spring Boot 是 Spring 的一个子项目,专注于简化 Spring 应用的创建和开发过程。

5.2 @autowire和@resource的区别

  1. 基因不同: 首先其最大的不同在于她们的爸爸妈妈不同(@Autowired是由org.springframework.beans.factory.annotation.Autowired提供,换句话说就是由Spring提供;@Resource是由javax.annotation.Resource提供,即J2EE提供,需要JDK1.6及以上。)

  2. @Autowired@Resource 都用于自动装配 bean,但它们的工作方式有所不同。

    • @Autowired :是 Spring 提供的注解。它根据类型来自动装配。如果存在类型的多个实现,则会按照 bean 的名称进行匹配。可以配合 @Qualifier 注解使用,通过指定的名字来匹配 bean。

    • @Resource :是 Java EE 提供的注解。它可以按照名称或类型进行自动装配。@Resource 注解有一个属性 name,可以指定一个 bean 的名称进行注入。如果不指定 name 属性,它会默认按照字段名称进行装配。

    以下是两个注解的简单例子:

    java 复制代码
    public class MyClass {
    
        // 使用 @Autowired
        @Autowired
        private MyService myService;
        
        // 使用 @Resource
        @Resource(name = "myService")
        private MyService myService;
    }

    总结来说,@Autowired 是根据类型进行自动装配的(如果有多个同类型的 bean,则根据名字进行匹配),而 @Resource 是默认按照名字进行自动装配的。

5.3 为什么我看到大家很少用@Resource,而是@Autowire用的多

5.4 哪一个性能更好

6

相关推荐
柯34911 分钟前
GC垃圾回收
java·jvm·垃圾回收
redemption_233 分钟前
SpringMVC-03-HelloSpring
java
平头哥在等你1 小时前
C语言简答题答案
java·c语言·jvm
LKID体1 小时前
【python图解】数据结构之字典和集合
java·服务器·前端
HUT_Tyne2651 小时前
力扣--LCR 154.复杂链表的复制
java·leetcode·链表
黄昏_1 小时前
在Springboot项目中实现将文件上传至阿里云 OSS
java·spring boot·后端·阿里云
写bug写bug2 小时前
用Java Executors创建线程池的9种方法
java·后端
期待未来的男孩2 小时前
安全加固方案
java·网络·安全
惜.己2 小时前
Jmeter中的配置原件
java·前端·数据库
zhuzhihongNO12 小时前
JVM(JAVA虚拟机)内存溢出导致内存不足,Java运行时环境无法继续
java·开发语言·jvm·内存溢出·jvm内存溢出