SpringBoot复习笔记;突击面试专用;_springboot 面试笔记-程序员宅基地

技术标签: spring boot  面试  java  java主流框架  

SpringBoot部分

为什么用springboot?有什么优点?

  • Spring Boot 简化了Spring 应用程序的开发和部署,他能够快速搭建基于 Spring 的 Web 应用,无需编写大量的配置文件和代码。
  • Spring Boot 提供了丰富的自动配置功能,能够自动配置数据库、缓存、消息队列等web应用的常见组件。扩展性也很强,可以自定义配置自己的组件而不用默认组件。
  • Spring Boot 也支持微服务,其中的Spring Cloud提供了很多分布式应用开发中需要的功能和组件,包括服务注册与发现、服务治理、分布式配置、负载均衡、熔断器、API 网关等。

SpringBoot-依赖管理特性是什么?

  • 父项目做依赖管理:pring-boot-starter-parent
    父项目的主要功能就是依赖管理,子项目只要继承了父项目,那么子项目的依赖都跟父项目一样,不用再额外配置。
  • 依赖里的starter叫做场景启动器,只要引入starter,这个场景的所有常规需要的依赖我们都自动引入,比如web场景,我们只需要引用spring-boot-starter-web,那么所有常规web开发需要用到的依赖都已经导进来了。
    spring-boot-starter-* 是官方的场景启动器
    *-spring-boot-starter是第三方提供的场景启动器
  • 无需关注版本号,自动版本仲裁,即默认使用父项目依赖里的版本号,如果要修改,在pom,xml文件里指定版本号

SpringBoot-自动配置特性是什么?

  • 自动配好Tomcat服务器,能够直接启动运行
  • 自动配好SpringMVC常用组件功能
  • 主程序@SpringBootApplication所在包及其下面的所有子包里面的组件都会被默认扫描进来,无需以前的包扫描配置@ComponentScan。
  • 各种配置拥有默认值,比如Web应用端口号默认8080

什么是tomcat容器?SpringBoot如何不用自带的tomcat而用其他的容器来启动?

  • Tomcat是Apache基金下的一个轻量级的开源免费的Servlet容器,Tomcat本身包含了HTTP服务器,因此也可以视作单独的Web服务器。

  • Undertow是一款灵活的高性能Web服务器,采用Java语言开发,支持阻塞IO和非阻塞IO。由于Undertow采用Java语言开发,可以直接嵌入到Java项目中使用。同时, Undertow完全支持Servlet和Web Socket,在高并发情况下表现非常出色。

  • 具体做法就是在项目的pom.xml 文件去除内置tomcat依赖并添加Undertow的依赖,即:

    <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
     <!-- 去除内嵌tomcat -->
      <exclusions>
         <exclusion>
            <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-tomcat</artifactId>
         </exclusion>
      </exclusions>
      <!-- 去除内嵌tomcat -->
    </dependency>
    
    <!--添加Undertow的依赖-->
      <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-undertow</artifactId>
       </dependency>
    <!--添加Undertow的依赖-->
    
    
  • 还可已自定义配置Undertow容器的参数:

    server:
      undertow:
    # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程。不要设置过大,如果过大,启动项目会报错:打开文件数过多
         io-threads: 16
    # 阻塞任务线程池, 当执行类似servlet请求阻塞IO操作, undertow会从这个线程池中取得线程。它的值设置取决于系统线程执行任务的阻塞系数,默认值是IO线程数*8
         worker-threads: 256
    # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理。每块buffer的空间大小,越小的空间被利用越充分,不要设置太大,以免影响其他应用,合适即可
         buffer-size: 1024
    # 每个区分配的buffer数量 , 所以pool的大小是buffer-size * buffers-per-region
         buffers-per-region: 1024
    # 是否分配的直接内存(NIO直接分配的堆外内存)
         direct-buffers: true
    

Spring Boot启动时都做了什么?为什么启动之后就得到了一个web服务器?

  • 加载应用程序的配置文件和组件信息。
  • 进行自动配置:包括自动扫描、注册和实例化所有标记为@Component、@Service、@Repository和@Controller等注解的组件。
  • 根据应用程序的配置信息,自动配置数据源、缓存、消息队列等web应用的常见组件。
  • 自动配置嵌入式Web服务器(如Tomcat、Jetty或Undertow),包括设置端口号、上下文路径、SSL证书等信息。
  • 启动嵌入式Web服务器,并监听客户端请求,将请求分发到应用程序中的对应控制器(Controller)进行处理。

Spring向IOC容器添加组件的方法是什么?

(1)新建xml文件,设置每一个组件的id,全类名,属性的依赖注入等。获取ioc容器时读取这个xml文件。
(2)给每一个类上面添加注解@component@service@controller@repository表名这是组件,然后进行包扫描配置。就可以自动装配进IOC容器。

SpringBoot向IOC容器添加组件的方法是什么?

(1)使用注解@component@service@controller@repository表明是组件,只要类与MainApplication在同一个包下,就可以自动进行包扫描,自动装配进IOC容器。

(2)使用配置类。配置类能把外部引入类也能装进IOC容器。新建一个配置类,@Configuration 表示这是一个配置类。主要用于向IOC中注册组件。
配置类里面每一个方法都使用@Bean标签,表示这是其中一个组件。方法里直接new一个对象,返回给IOC容器。

组件名默认是方法名,注册的组件默认是单例的。

3)在配置类上使用@ImportResource(“classpath:beans.xml”)注解,复用以前的xml文件,就可自动装配用xml写的bean

启动类上的@SpringBootApplication注解有什么用?

它主要包含了三个注解@Configuration、@EnableAutoConfiguration、@ComponentScan

  • @Configuration(@SpringBootConfiguration点开查看发现里面还是应用了@Configuration)

    配置类,手动配置外部的类生成Bean装进IOC容器

  • @EnableAutoConfiguration

    开启自动配置功能

  • @ComponentScan

    配置包扫描路径,主要是把启动类同一个目录下的所有组件都给扫描装配到IOC里。

@EnableAutoConfiguration主要有什么用?

@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。她主要包含了2个注解@AutoConfigurationPackage@Import(AutoConfigurationImportSelector.class)。`

  • AutoConfigurationPackage :自动配置包,指定了默认的包规则
    主要是将指定的一个包下的所有组件导入IOC
  • @Import(AutoConfigurationImportSelector.class)初始加载自动配置类,选择所有需要导入到容器中的配置类。

配置类的bean对象如何控制单例和多例?

  • @Configuration(proxyBeanMethods = true) ,proxyBeanMethods = true表示这个配置类里面生成的bean都是单例
  • @Configuration(proxyBeanMethods = false) ,proxyBeanMethods = false表示这个配置类里面生成的bean都是多例

Spring底层怎么导入class类对象组件的?

  • 使用@import导入类对象组件。
  • 使用@Import({User.class, DBHelper.class})给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名

@Conditional条件装配有什么用?

  • 条件装配:满足Conditional指定的条件,则进行组件注入

  • 例如:@ConditionalOnMissingBean(name = “tom”)
    //没有tom名字的Bean时,MyConfig类的Bean才能生效。(整个配置类里面的bean才注册)

@ImportResource导入Spring配置文件?

  • 用于导入xml配置的bean
  • 公司以前使用bean.xml文件生成配置bean,现在为了省事,想继续复用bean.xml,就使用@ImportResource(“classpath:beans.xml”)

@ConfigurationProperties配置绑定怎么用?

  • SpringBoot会自动读取到properties、yml文件中的配置,在使用了@ConfigurationProperties(prefix = “mycar”)这个注解的组件上进行配置绑定。

  • 若该类不能修改,则用这个方式
    //@EnableConfigurationProperties(Car.class) // 开启Car类的配置绑定功能 //@ConfigurationProperties (prefix = “mycar”)//注入前缀为mycar的属性
    //使用这种方式,就把注解放在配置类头上。
    注意也需要在spring boot application头上使用@EnableConfigurationProperties的注解开启自动配置功能。

  • @Value 比较适用于配置比较少的场景,而 @ConfigurationProperties 则更适用于有很多配置的情况。
    @Value()需要填写前后缀整个配置名;而@ConfigurationProperties (prefix = “mycar”)匹配前缀后,只需要字段名与配置的后缀相同,就能自动注入,更方便快捷。
    如:

    @ConfigurationProperties(prefix = "oauth")
    public class PropertiesConfiguration {
        private String clientId;
        private String clientSecret;
        private String redirectUri;
        private String grantType;
    }
    //配置
    oauth:
      client_id: id                          
      client-secret: secret
      redirect_uri: http://aisensiy.github.io
      grantType: code
    

自动配置流程是怎样的?

  • SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
  • 每个自动配置类按照条件(@condition)进行生效,默认都会绑定配置文件指定的值。(xxxxProperties里面读取,xxxProperties和配置文件进行了绑定)
  • 生效的配置类就会给容器中装配很多组件,也就是bean
  • 只要容器中有这些组件,相当于这些功能就有了,免去了我们手动编写配置注入功能组件等的工作
  • 定制化配置
    • 用户直接自己@Bean替换底层的组件
    • 用户去看这个组件是获取的配置文件什么值就去修改。

加载配置类–》配置类绑定配置文件指定值–》配置类给容器装配组件

Lombok插件有什么用?

  • Lombok能简化代码,自动生成get、set、toString、构造器等代码。
  • 使用@Data、@ToString、@NoArgsConstructor等注解即可
  • @Slf4j:注解在类上;为类提供一个 属性名为log 的 Slf4j日志对像,就可以在代码里直接使用log.info()记录日志。否则要手动添加在这个类里面:private final Logger log = LoggerFactory.getLogger(当前类名.class);

配置文件yml怎么用?

  • 格式key: value
  • 使用缩进表示层级关系,相同层级的元素需要左对齐

静态资源访问规则?

  • 只要静态资源放在类路径下,包括static、public、resources、/META-INF/resources ,那么springboot项目启动时,这些资源能直接在url地址上访问到

  • 她的处理逻辑是:请求进来,先去找Controller看能不能处理。不能处理的所有请求又都交给静态资源处理器。静态资源也找不到则响应404页面。

  • 静态资源访问前缀配置:访问的时候必须带有/res/, 才能访问到静态资源。

    spring:
      mvc:
        static-path-pattern: /res/**
    

请求映射类型,具体流程?

  • @GetMapping、@PostMapping、@PutMapping、@DeleteMapping
  • 请求进来首先会调用DispatcherServlet->doDispatch(),将请求分配给对应的请求处理器MappingHandler,找到了对应的请求处理器在分配给 指定的Mapping方法处理。

请求处理中常用的参数注解?

  • @PathVariable 路径变量,url中/类型的参数
  • @RequestParam 获取请求参数(指问号后的参数,url?a=1&b=2)
  • @RequestBody 获取请求体[POST]
  • @CookieValue 获取Cookie值
  • @RequestHeader 获取请求头
  • @RequestAttribute 获取request域属性

拦截器实现登录检查和资源放行?

  • 首先实现HandlerInterceptor一个拦截器接口,定义拦截器的拦截逻辑,比如未登录就跳转到登录页面。
  • 然后在WebMvcConfigurer配置类中 注册 拦截器
  • 然后通过addPathPatterns指定 需要这个拦截器拦截的 访问路径

拦截器的执行时机和原理?

  • 据当前请求,可以处理请求的handler以及handler的所有 拦截器
  • 先来顺序执行 所有拦截器的 preHandle()方法。
    • 如果当前拦截器preHandle()返回为true。则执行下一个拦截器的preHandle()
    • 如果当前拦截器返回为false。直接倒序执行所有已经执行了的拦截器的 afterCompletion();
  • 如果任何一个拦截器返回false,直接跳出不执行目标方法。
  • 所有拦截器都返回true,才执行目标方法。
  • 倒序执行所有拦截器的postHandle()方法。(成功执行目标方法后)
  • 前面的步骤有任何异常都会直接倒序触发 afterCompletion()
  • 页面成功渲染完成以后,也会倒序触发 afterCompletion()(成功页面渲染后)
    (图源自尚硅谷)
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NSXBrDxI-1680144423296)(D:\学习资料\笔记\java主流框架\SpringBoot\assets\20210205011212637.png)]

错误异常处理逻辑?

  • 使用@ControllerAdvice+@ExceptionHandler处理全局异常;底层是 ExceptionHandlerExceptionResolver 支持的
  • 首先在全局异常处理类上使用注解@RestControllerAdvice,里面使用@ExceptionHandler(value = ServeException.class)注解,根据异常的类型使用不同的方法处理异常,或者说返回不同的提示。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cyming_/article/details/129853102

智能推荐

python中的库有什么作用,python库在哪个文件夹_python中导入的库有什么用-程序员宅基地

文章浏览阅读801次,点赞16次,收藏21次。嗨喽,大家好呀~这里是爱看美女的茜茜呐又到了学Python时刻~随着大数据和人工智能的发展,Python也与多种科技深深绑定。比如自动化测试,运维,爬虫,数据分析,机器学习,金融领域,后端开发,云计算,游戏开发都有涉及python画笑脸的源代码。万丈高楼平地起,Python这座大厦能够如此强大,就是拥有强大的成千上万的库的支持无数牛x的轮子在支持这座大厦,今天我们来一起梳理一下,俯瞰整个Python宝库。那么什么是库呢?从代码角度讲:库就是一堆类(class)和函数(function)的集合。_python中导入的库有什么用

springMvc 的三种url映射处理器的实现-程序员宅基地

文章浏览阅读191次。为什么80%的码农都做不了架构师?>>> ..._spring mvc通过filter实现url映射

解决 Splunk windows数据接入奇葩问题_windows日志无法自动转发到splunk-程序员宅基地

文章浏览阅读946次。Splunk 对app 下面的inputs.conf 文件到 监控路径有严格的要求。_windows日志无法自动转发到splunk

基于ubuntu搭建qemu+risc-v虚拟机流程详细说明_ubuntu安装qemu riscv-程序员宅基地

文章浏览阅读551次,点赞12次,收藏5次。我尝试过ubuntu22.04系统和windows11下vmare+ubuntu22.04虚拟机,都可以进行搭建,旧版本的ubuntu,比如20.04/18.04等,问题应该也不大,可以先尝试。将文件copy到解压后的ubuntu-22.04-rootfs文件夹中的某个目录即可,示例如下,copy一个视频文件到test文件夹,mount后,可以看到该视频文件。这时候,mount.sh,umount.sh,tar_rootfs.sh和解压后的ubuntu-22.04-rootfs文件夹处于同级目录。_ubuntu安装qemu riscv

[心跳] 互联网推送服务原理:长连接+心跳机制-程序员宅基地

文章浏览阅读47次。互联网推送消息的方式很常见,特别是移动互联网上,手机每天都能收到好多推送消息,经过研究发现,这些推送服务的原理都是维护一个长连接(要不不可能达到实时效果),但普通的socket连接对服务器的消耗太大了,所以才会出现像MQTT这种轻量级低消耗的协议来维护长连接,那么要如何维护长连接呢? 在写之前,我们首先了解一下为什么android维护长连接需要心跳机制,首先我们知道,维护任何一个长连接..._微服务 心跳原理

芯片开发语言的简单区别介绍。Verilog、VHDL、System Verilog、SystemC、Matlab、C/C++等_芯片rtl是用什么语言写的-程序员宅基地

文章浏览阅读1w次,点赞9次,收藏24次。芯片开发语言的简单区别介绍芯片设计前端的流程很长,和芯片前端相关的语言也很多,比如Verilog、VHDL、System Verilog、SystemC、Matlab、C/C++等等,但没有一个语言能够做到适合于整个前端流程;每种语言都有适合使用的领域,只有在整个前端流程的不同节点上选择最合适的语言工具,并加以整合,才能加速产品开发。注:本图引用自《SystemC: From the Groud Up》如上图所示,它显示了各种语言工具适合使用的场所,其中:Verilog、VHDL主要用于RTL建_芯片rtl是用什么语言写的

随便推点

51Nod - 1765 期望推导_51nod1765-程序员宅基地

文章浏览阅读751次。题意:题目链接:https://www.51nod.com/onlineJudge/submitDetail.html#!judgeId=223971 每次生成一个[0,n)的随机数,如果这个随机数和给出的m个数字中的其中一个数字相等,那么就停止生成随机数,否则继续生成,求出所有生成的数的和的期望。思路:求期望的一种套路,可以列出一个关于期望E的方程,然后求解方程得出E的表达式。 对这道题来说,_51nod1765

《系统架构设计师教程(第2版)》第6章-数据库设计基础知识-05-NoSQL数据库-程序员宅基地

文章浏览阅读860次,点赞6次,收藏11次。《系统架构设计师教程(第2版)》笔记,第6章-数据库设计基础知识-05-NoSQL数据库

学习Oracle数据库入门到精通教程资料合集-程序员宅基地

文章浏览阅读173次。学习Oracle数据库入门到精通教程资料合集 原文地址:学习Oracle数据库入门到精通教程资料合集 作者:xuerong_wei 任何大型信息系统,都需要有数据库管理系统作为支撑。其中,Oracle以其卓越的性能获得了广泛的应用。本合集汇总了学习Oracle数据库从入门到精通的30份教程资料。资料名称下载地址超详细Oracle教程【PDF版电子..._oracle经典教程 pdf

员工满意度模型五大维度:解析员工幸福感的关键要素_员工满意度调查五个维度-程序员宅基地

文章浏览阅读904次。通过关注工作内容与挑战、工作环境与文化、管理与领导力、个人成长与发展以及薪酬与福利等关键要素,企业可以更好地了解员工的需求和期望,从而采取相应的措施来提高员工满意度。组织应该提供培训和发展计划,帮助员工提升专业技能和领导能力,同时为员工提供晋升和职业发展的机会,以满足员工的成长需求,提高满意度。管理者要成为员工的引领者和支持者,为员工提供积极的反馈和指导,帮助他们实现个人和团队的目标,从而提高员工满意度。一个积极向上、关注员工福祉的企业文化能够增强员工的归属感和认同感,提高员工的满意度。_员工满意度调查五个维度

QQ在异地登录的原因及应付方法._qq在异地登录是怎么回事-程序员宅基地

文章浏览阅读2.7k次。有时会遇到QQ在异地登录的情况。一旦你在使用QQ的过程中遇到这样的情况,你就要小心了,因为你的密码很可能已经泄漏。  原因1:可能你没有密保,或者密保被别人知道了。  解决方法:申请第二代密码保护。  申请第二代密码保护方法:  登陆QQ——菜单——安全中心——申请密码保护——升级为第二代密码保护——设置后保存。  再打开安全中心——安全设置——网络信息安全——设置为高  原因2:你的电脑上有木马_qq在异地登录是怎么回事

javascript 将json数据导出excel_js json转excel-程序员宅基地

文章浏览阅读977次。【代码】javascript 将json数据导出excel。_js json转excel

推荐文章

热门文章

相关标签