5.Spring&SpringBoot八股

Spring,Spring MVC,Spring Boot 之间什么关系?

Spring就是整个Spring框架的整体,包含AOP、JDBC、Spring MVC等等模块

SpringBoot是Spring的精简版,它在Spring的基础上添加了自动装配、内置tomcat服务器等功能,使得代码量更少,同时还添加了很多方便的注解,比如@Component等。

SpringMVC就是Spring框架专门用于web应用开发的模块,方便我们使用Model、View、Controller的三层架构。比如SpringBoot中的controller层、Service层、Mappler层,Entity层等等。

Spring相关

IOC、DI

ioc,控制反转,就是把创建对象实例的权力移交给了IOC容器来管理,创建好的实例都存储在单例池中

DI,依赖注入,就是把存在IOC容器中 的对象注入到该使用的地方去。

Bean的生命周期

1、BeanDefination的创建,在BeanFactory创建之后,把它放入BeanDefinitationMap中

2、根据BeanDefination,利用反射,实例化Bean对象

3、对实例化的Bean对象进行属性注入:

如果有setter方法,执行setter方法,

如果有Aware回调接口,则执行回调方法初始化对应的BeanName、BeanClassLoader、BeanFactory等

4、初始化

执行BeanPostProcessor中的PostProcessorBeforeInitialization方法

执行初始化方法

执行BeanPostProcessor中的PostProcessorAfterInitialization方法

5、放入单例池,使用

6、销毁

如果实现了DisableBean接口,执行Distory方法

非懒加载、懒加载、原型bean

默认非懒加载,最开始就存入IOC容器中

懒加载需要@Lazy,有需要才实例化。懒加载可以避免循环依赖问题

原型Bean就是非单例模式

BeanFactory和FactoryBean的区别?

前者是用来管理IOC容器的总接口

后者是用来实现自定义Bean的接口,如果要自定义bean,那就实现它,然后重写方法

BeanFactory和ApplicationContext的区别与联系?

后者是前者的子接口,因此,后者拥有前者的功能,即能够获取当前IOC容器中的实例对象

其次,后者还可以获取当前的环境变量等额外功能。

@Bean和FactoryBean的关系?

都可以创建实例到IOC容器中,

前者只创建一个Bean,有完整的生命周期

后者创建两个Bean,代理的Bean有完整的生命周期,被代理的原始对象只会存在于初始化

Spring支持哪些依赖注入的方式?

1、字段注入

2、Setter注入

3、构造器注入

为什么推荐构造器注入而不用字段注入?

1、掩盖了依赖注入的问题(虽然三级缓存能够解决这个问题),而构造器注入能够明确依赖之间的关系,从而避免依赖注入的发生。

2、字段注入不利于单元测试,需要mock一个对象才能执行。而构造注入很方便。

什么是Bean的循环依赖?如何解决循环依赖?

就是A引用B,B引用A。

对于字段注入,使用三级缓存解决

对于构造器、setter注入,使用懒加载解决。

三级缓存如何解决循环依赖?

解决循环依赖一定需要第三级缓存吗?

主要是为了防止AOP状态下的三级缓存

第三级缓存提供了一个lambda函数,用于判断当前是否为AOP类型的注入,如果是,则返回代理对象。

这样就避免了循环依赖的情况下,只能注入原初始化的对象,而无法注入代理对象。

解决循环依赖一定需要第二级缓存吗?

需要,假设A引用B\C,B->A, C->A,

A注入了B,此时要注入C,如果没有介于两者之间的,A就拿不到了。

什么场景下的循环依赖Spring无法解决?

构造器

原型Bean

@Lazy注解如何解决循环依赖?

其他时候都是代理对象加状态存在,因此解决了循环依赖问题。

将一个类声明为 Bean 的注解有哪些?

3种

@Autowired 和 @Resource 的区别是什么?(4个)

Bean 的作用域有哪些?如何配置呢?

scope:

  1. singleton
  2. prototype
  3. session
  4. request

Bean 是线程安全的吗?如何保证线程安全?

Spring AoP

1、介绍

面向切面编程

原理是基于动态代理+反射

2、使用,自定义打印日志的功能

1、先定义一个注解Interface

2、在使用的方法前面加上这个注解

3、写一个切面类,aspect

  1. 定义切点pointcut是注解。
  2. 定义环绕通知,around advice
  3. 环绕通知入参为连接点join point,他代表注解修饰的具体方法,在环绕通知前后写额外的方法即可

3、aop的两种实现方式?

4、多个切面的执行顺序如何控制?

5、AOP 的应用场景有哪些?

日志打印

事务

限流

6、AOP失效的情况?

  1. 内部调用
  2. 静态方法
  3. 私有方法

Spring MVC

介绍Spring MVC

3个部分

4个层次

执行流程

核心组件

1、handlerMapping

2、handlerAdapter

3、DispatchServlet

4、ViewResolver

过程

先传给DispatcherServlet。

1、handerMapping找controller

2、交给HandlerAdapter适配对应的Controller

3、Controller返回model和view

4、根据View解析视图,然后结合modle返回

SpringMVC的启动流程?

大概就是:

SpringBoot启动了,顺便在BeanFactory初始化的时候,tomcat也启动了,因此DispatcherServlet启动了,拦截就生效了。

统一异常处理怎么做?

ControllerAdvice + ExceptionHandler

Spring Data JPA

只需要知道,它和Mybatis一样都是ORM数据持久化的框架。

不过Mybatis比它更灵活,因此它用到不多。

Spring Security

登录流程

写SecurityConfig,继承自WebSecurityConfiguratorAdaptor

  1. 重写passwordEncoder
  2. config
  3. authenticManeger

实现UserDeailServiceImpl,getUserDetail,

验证用户名密码之后,根据id生成JWT,然后redis存入key为id,val为用户信息。

设置拦截器类OncePerRequestFilter,获取前端jwt,解析后到redis找,找到了之后,把用户信息整体存入线程本地变量。

1、JWT的作用

加密,实现前后端之间交互的身份认证

2、Redis的作用

保证单点登录有效,

每次拦截请求后都会刷新有效期,

只有当Redis的信息过期后,才会显示登录过期,需要重新登录

3、线程本地变量的作用

线程本地变量的生命周期依赖于Request,即只在本次请求中有效!

它的作用就是方便这次请求的时候,如果需要知道这个请求发起的用户的信息时,不再需要去redis或者再jwt解析了,而是直接从现场本地变量获取即可!!!

Spring中的设计模式

1、单例模式

Bean的IOC池,

2、工厂模式

Collection类

3、适配器模式

HandlerAdapter

类1

接口

接口的实现

  • 构造器获得类1的实例
  • 执行更多

4、装饰器模式

接口

实现1

实现2

  • 构造器获得实现1的实例
  • 执行更多

5、观察者模式

被观察的接口a(两个抽象方法,注册、唤醒)

观察者接口b(一个方法执行)

接口a的唯一实现aa(一个list,重写两个方法)

接口b的多个实现b1、b2。。。(只需要重写一个方法即可)

Spring事务

事务的特性:

ACID

原子性

持久性

隔离性

一致性

Spring如何支持事务

1、前提,数据库支持事务

2、两种方式

  1. 显式地使用TractionalTemplate接口实现
  2. 使用@Transactional注解,

事务的传播行为

3种

Reqired,如果有,则直接加入当前事务

Requires new,无论有没有,都新增事务

Nested,如果有,则新增一个存档点,而不是直接新增事务。

举例说明:

事务隔离级别

读未提交

读已提交

可重复读

可串行化

脏读,就是更新过程中可以读,

不可重复度,就是重复读一个正在修改的数据,前后读到的内容不一样

幻读,就是重复读一个count,前后不一样

@transactional的原理

Spring自身不实现隔离,只是提供了回滚和提交的标记。

真正的隔离级别的实现取决于数据库。这也是为什么如果数据库是MYISAM,Spring的事务就失效了。

@Transactional的原理是通过aop+动态代理,在动态代理的方法前后添加事务提交和回滚的标记。

事务失效的情况

。。。

@Async注解为什么不建议使用?

SpringBoot

SpringBoot的主要优点有哪些?即和Spring的区别?

1、自动装配

2、自带web应用

3、内置cli

什么是 Spring Boot Starters?

1、Spring官方或者热门的第三方组件一般都会维护一个Starters。

官方的是 Spring-boot-xxx-starters、第三方的是xxx-Spring-boot-starters

2、引入xml后,不需要担心版本问题和依赖问题

3、支持自动装配

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

tomcat、jetty、undertow

默认tomcat,如果要用别的,只需要更改xml即可

介绍一下@SpringBootApplication 注解

1、EnableAutoConfirguation

2、Confirguation

3、ComponentScan

SpringBoot的启动流程

1、初始化SpringApplication

  1. 确定要用哪个web服务
  2. 创建初始化器、监听器

2、执行SpringApplication的run方法

  1. 启动监听器
  2. 加载环境变量配置信息
  3. 创建Spring容器
  4. 启动容器前的操作
  5. 启动容器(启动SpringFactory、自动装配,启动Web应用)
  6. 发布就绪

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

1、什么是自动装配

就是在应用依赖第三方组件的时候,只需要导入依赖即可,不需要再写繁琐的xml、Bean文件了

2、如何实现的自动装配?

通过EnableAutoConfirguation实现

在第三方组件的依赖导入时,通过starter约定了所有需要导入的内容都有一个配置类,然后把需要导入的用Bean修饰

SpringFactoryLoader,约定去每个第三方组件的jar包的META-INF的spirng。factiories中有全类名。然后根据全类名进行加载

加载的过程中是通过import selector配合被加载的Bean前面的条件注解是否被满足来判断是否需要加载,比如它有一个ConditionalOnclass(。。。)那么就需要提前有这个类才会加载。

SpringBoot中如何自定义Starter?

1、父

2、xxx-springboot-starter,空项目

3、xxx-springboot-starter-autoconfigurer

  1. confirgurationProporties
  2. service
  3. @Config+@Bean、@enableConfirgurationProporties、@ConditionalOnClass
  4. META-INF。。。

4、install

5、xml导入即可使用了

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

1、Bean相关

2、http相关

3、前后端传值

4、读取配置

Spring Boot 常用的读取配置文件的方法有哪些?

背两个

@Values

@ConfirgurationProporties

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

1、

2、

3、

什么是Bean 映射工具?常用的 Bean 映射工具有哪些?

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

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

1、实体类上加

2、参数前面加

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

启动任务接口

启动类注解

方法注解

@RestController

MyBatis

使用MyBatis

1、写实体类

2、写mapper接口继承自BaseMapper

3、写serviceImpl继承自ServiceImpl

新增Mapper接口的方法

新增mapper。xml写具体的sql

SQL注入? #{} ${}

什么是DAO层?

Mapper接口中只能有一个有参方法和一个无参方法

MyBatis 是如何进行分页的?分页插件的原理是什么?

默认:逻辑分页

可以自定义实现物理分页

也可以使用第三方组件实现物理分页(PageHelper)

Mybatis如何编写一个插件?

原理:AOP,动态代理

实现:

  1. @Intercepts
  2. 实现Interceptor接口,
  3. 写intercept方法,具体的sql语句

动态sql

if

where

choose

foreach

原理:动态代理

Mybatis只有接口没有实现类,为什么能调用去操作数据库?

  1. 写了mapper
  2. 动态代理接口,生成对应的方法

Mybatis和Mybatis-plus的区别?

Mybatis和Hibernate

ORM

半自动映射

MyBatis中有哪几种字段映射的方式

resultType和resultMap

说说Mybatis中查询SQL的执行流程

1、创建sqlSessionFactory

2、开启一个OpenSession

3、关联到Mapper动态代理生成的实现类

4、执行类的方法,执行sql

说说MyBatis中的数据库连接池

说说MyBatis中的延迟加载

Netty

基于NIO的网络通信框架

比如RocketMQ的网络传输就是用Netty实现的。

原理

selector单个,对应一个线程

channel多个

client对应每个channel

什么是 TCP 粘包/拆包?有什么解决办法呢?

相关推荐
蓝黑202016 分钟前
IntelliJ IDEA常用快捷键
java·ide·intellij-idea
Ysjt | 深17 分钟前
C++多线程编程入门教程(优质版)
java·开发语言·jvm·c++
凌冰_19 分钟前
IDEA2023 SpringBoot整合MyBatis(三)
spring boot·后端·mybatis
shuangrenlong29 分钟前
slice介绍slice查看器
java·ubuntu
牧竹子30 分钟前
对原jar包解压后修改原class文件后重新打包为jar
java·jar
数据小爬虫@40 分钟前
如何利用java爬虫获得淘宝商品评论
java·开发语言·爬虫
喜欢猪猪42 分钟前
面试题---深入源码理解MQ长轮询优化机制
java
天天进步20151 小时前
Vue+Springboot用Websocket实现协同编辑
vue.js·spring boot·websocket
草莓base1 小时前
【手写一个spring】spring源码的简单实现--bean对象的创建
java·spring·rpc
drebander2 小时前
使用 Java Stream 优雅实现List 转化为Map<key,Map<key,value>>
java·python·list