SpringBoot复习笔记;突击面试专用;

SpringBoot简化了Spring应用的开发,通过自动配置和依赖管理特性,能快速构建Web应用。它内置Tomcat或支持Undertow等服务器,支持微服务架构。自动配置包括SpringMVC组件和常见服务,启动时加载配置、初始化组件并启动Web服务器。开发者可以通过注解控制组件的注册和作用域,以及使用Lombok简化代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)注解,根据异常的类型使用不同的方法处理异常,或者说返回不同的提示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值