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:
- singleton
- prototype
- session
- request
Bean 是线程安全的吗?如何保证线程安全?
Spring AoP
1、介绍
面向切面编程
原理是基于动态代理+反射
2、使用,自定义打印日志的功能
1、先定义一个注解Interface
2、在使用的方法前面加上这个注解
3、写一个切面类,aspect
- 定义切点pointcut是注解。
- 定义环绕通知,around advice
- 环绕通知入参为连接点join point,他代表注解修饰的具体方法,在环绕通知前后写额外的方法即可
3、aop的两种实现方式?
4、多个切面的执行顺序如何控制?
5、AOP 的应用场景有哪些?
日志打印
事务
限流
6、AOP失效的情况?
- 内部调用
- 静态方法
- 私有方法
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
- 重写passwordEncoder
- config
- 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、两种方式
- 显式地使用TractionalTemplate接口实现
- 使用@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
- 确定要用哪个web服务
- 创建初始化器、监听器
2、执行SpringApplication的run方法
- 启动监听器
- 加载环境变量配置信息
- 创建Spring容器
- 启动容器前的操作
- 启动容器(启动SpringFactory、自动装配,启动Web应用)
- 发布就绪
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
- confirgurationProporties
- service
- @Config+@Bean、@enableConfirgurationProporties、@ConditionalOnClass
- 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,动态代理
实现:
- @Intercepts
- 实现Interceptor接口,
- 写intercept方法,具体的sql语句
动态sql
if
where
choose
foreach
原理:动态代理
Mybatis只有接口没有实现类,为什么能调用去操作数据库?
- 写了mapper
- 动态代理接口,生成对应的方法
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