文章目录
一、Spring
1、spring生命周期跳转
2、了解下FactoryBean和BeanFactory的区别 跳转
3、Spring三级缓存梳理 跳转
4、Cglib代理和JDK代理原理的区别 跳转
5、在看看Spring是如何处理@Autowired、@Resource注解及区别 跳转
6、Spring必须要了解的几个《后置处理器》跳转
6、Spring如何处理@Import注解
《@Import(ImportBeanDefinitionRegistrar)》
ImportBeanDefinitionRegistrar接口也是修改BD的元数据。AspectJ就是通过这个方式实现的。
7、接着我们看下切面
先了解下切面的基础概念 《spring Aspect注解》
了解下切面的种类《切点切面和引介切面》
Spring是如何处理@Aspect注解的《@Aspect源码分析》
8、事务相关
Spring事务 《@Transactional源码分析》
然后我们在看看Spring事务的传播和传播原理
事务传播基础概念
下面看看这三种传播机制是如何实现的
PROPAGATION_REQUIRED 默认传播机制
PROPAGATION_REQUIRES_NEW
PROPAGATION_PROPAGATION_NESTED 事务嵌套
9、Spring的其他组件
@Async的使用和源码分析《@Async使用案例和自定义线程池》
然后看看Spring是怎么实现Async的《@Async源码分析》
Spring的@Feign源码分析 @Feign
小结:
@AspectJ的处理路程
@EnableAspectJAutoProxy->@Implrt(AspectJAutoProxyRegistrar)->
2、加载AnnotationAwareAspectJAutoProxyCreator(后置处理器)->
初始化:判断是否符合切点的规则,如果符合创建代理,添加切面到代理类里面去。
@Transactional的处理流程
@EnableTransactionManagement->import(TransactionManagementConfigurationSelector)
->生成AutoProxyRegistrar(后置处理器)+ ProxyTransactionManagementConfiguration(切面)
@Async的处理流程
@EnableAsync()->AsyncAnnotationBeanPostProcessor(后置处理器)->处理@Async注解,并创建代理对象。
AsyncAnnotationAdvisor会生成(切面)
AnnotationAsyncExecutionInterceptor(通知或者说是拦截器)
AnnotationMatchingPointcut(切点)
@Controller.class和@RequestMapping.class
1、启动时:AbstractHandlerMethodMapping->判断是否包含Controller.class和RequestMapping.class
->保存到mappingRegistry
2、调用时:DispatcherServlet->doDispatch->通过Url查询mappingRegistry->反射调用对应的Method类
@Feign的处理流程
1、@EnableFeignClients->Import(FeignClientsRegistrar)->
将带有@FeignClient的接口转成FactroyBean,通过getObject得到实例对象
2、在getObject返回的是代理对象,当调用接口方法时会被
FeignInvocationHandler.invoker方法拦截,内部会调用FeignClient发送http请求。
10、Spring的应用
先来个热身 《写一个Spring启动器》
11、Spring常用注解
这些注解你认识多少,知道他们怎么处理的吗《常用注解功能和原理》
Spring Cloud
Cloud五大组件:跳转
1、Eureka
2、ribbon
ribbon原理 跳转
3、hystrix
hystrix功能汇总 跳转
Sentinel功能介绍以及和Hystrix的差异 跳转
4、Feign
Feign相关介绍跳转
二、Mybatis
流程图:跳转
1、先了解下Mybatis的启动流程,熟悉下Mybatis重要的几个类《mybatis执行流程1》
《mybatis执行流程2》
Mybatis
1、配置转成Configuration
2、Configuration得到SqlSessionFactory(创建JdbcTransactionFactory,由JdbcTransactionFactory
得到JdbcTransaction,JdbcTransaction得到CachingExecutor)
3、SqlSessionFactory得到SqlSession
4、SqlSession得到代理对象MapperProxy(Mapper转成MapperProxyFactory,MapperProxyFactory.getObject
创建【Mapper接口】的代理对象MapperProxy)
5、MapperProxy里面有SqlCommand+Method
6、通过MapperProxy执行方法。
Mybatis整合Spring
1、SqlSessionFactoryBean(需要DataSource配置)
2、SqlSessionFactoryBean得到SqlSessionFactory
3、SqlSessionFactory得到SqlSessionTemplate
4、SqlSessionTemplate包含SqlSession (如何得到SqlSession?)
5、通过SqlSessionTemplate得到Mapper的代理对象(通过SqlSession获取Mapper)。
6、通过Mapper代理对象执行方案。
2、接着我们在看下mybatis结合Spring后的启动流程和源码 《Spring-mybatis启动流程和源码》
3、了解大致流程,我们挑几个内容详细分析,比如执行器《Mybatis的执行器之间的关系》
4、看完执行器我们可以在看看面试常问的一级二级缓存《一级缓存二级缓存使用和实现原理》
Mybatis-Demo
https://blog.youkuaiyun.com/weixin_37862824/article/details/107256420
事务介绍:
https://blog.youkuaiyun.com/weixin_37862824/article/details/108873323
Mybatis框架源码分析1
1、https://blog.youkuaiyun.com/weixin_37862824/article/details/107260190
MyBatis原理分析常见类和标签介绍
https://blog.youkuaiyun.com/weixin_37862824/article/details/113857844
spring整合mybatis简单Demo
https://blog.youkuaiyun.com/weixin_37862824/article/details/105975395
Spring-mybatis框架源码分析:
mybatis进阶:mybatis一级缓存和二级缓存
https://blog.youkuaiyun.com/weixin_37862824/article/details/106020145
三、Servlet
基于Servlet实现的异步处理 《Servlet3.0异步请求监听器AsyncListener 》
Springboot最多可以【同时处理】多少请求 跳转
1、SpringMvc
关于SpringMvc的执行流程面试是比问的《SpringMvc执行流程》
知道执行流程,我们还需要知道SpringMvc主要是通过哪些类来完成请求的SpringMvc相关类的作用
下面在具体看一下我们自定义的Controller,request是怎么找到的通过request找到Controller
四、设计模式:
2、SpringMvc
3、AOP
类加载
Spring中常用的设计模式 【跳转】
所有设计模式作用和优点小结:【跳转】
五、Java基础
1、反射
2、代理
动态代理和静态代理 跳转
代理总结 跳转
3、锁
什么是锁 跳转
并发高性能LongAdder类 跳转
并发高性能LongAccumulator类 跳转
JUC下面的类 跳转
ReentrantLock通过Condition实现锁对象的监视器功能
小结:
1、如果线程从运行到阻塞,再到运行,涉及到用户态和内核态之间的相互切换,这是很消耗资源的,因为这里涉及到内存的切换,传递给许多变量、参数等等。所以说Synchronized是重量级锁,他会让线程阻塞。
2、那么自旋锁是怎么做的呢,他先是让线程在for循环里面循环,做无用功,当超过一定的时间,还是没有拿到锁,才会进入到阻塞。自旋锁的目的是为了占着CPU的资源不释放。 因为这段时间的自旋,比阻塞的代价要小的多。自旋锁尽可能的减少线程的阻塞,因为自旋的消耗会小于线程阻塞挂起再唤醒的操作的消耗,当然这只适用于锁竞争不激烈的情况下,如果是锁竞争非常激烈,这时候就不适合使用自旋锁了,因为自旋锁在获取锁前一直都是占用cpu做无用功,这种情况下我们要关闭自旋锁
偏向锁->轻量级锁-自旋锁-重量级锁, 关于锁定升级过程可以看这里【跳转】
锁升级小结
1、检测所对象的MarkWord里面,锁标志位01,无偏向。这是JVM给的初始值。
2、使用CAS将当前线程的ID替换MardWord的【锁线程ID】,如果成功则表示当前线程获得偏向锁,置偏向标志位01,如果失败,则说明发生竞争,撤销偏向锁,进而升级为【轻量级锁】
3、多次尝试,通过当前线程使用CAS将对象头的MarkWord替换为锁记录指针,如果成功,当前线程获得锁,则依然处于轻量级状态。
4、如果自旋失败,并且超过自选次数5次,则升级为【重量级锁】。
偏向锁、轻量锁、自旋锁都属于乐观锁。
重量级锁-Synchronized属于悲观锁
自旋锁尽可能的减少线程的阻塞,这对于锁的竞争不激烈,且占用锁时间非常短的代码块来说性能能大幅度的提升,
因为自旋的消耗会小于线程阻塞挂起再唤醒的操作的消耗,JVM有个很重要的参数就是自旋次数。
HotSpot是java的虚拟机,对象在内存中的存储分为三块区域:
1、对象头
2、实例数据
3、对齐填充
其中对象头又分为三块:markword、Klass Pointer、ArrayLength(假如对象为数组)
1、markword中包含了和Java对象息息相关的一些信息,它的实际大小一般和CPU字长保持一致,如在32位CPU上markword的大小一般为32位,即4字节。而在64位CPU上markword的大小一般为64位,即8字节
2、Klass Pointer Class 对象的类型指针,它指向对象对应的Class对象的内存地址。大小占4字节
在面试中,关于Markword的问题是非常常见的。以下是一些可能问到的问题:
1、什么是Markword?它在内存分配和垃圾回收中的作用是什么? 对象在内存的结构主要是3大块,对象头,实例数据,对其填充,对象头主要包含两大块,markwork和kclass point
2、Markword的存储结构是什么? HashCode+分代年龄+锁标识
3、Markword的大小通常是多少?
4、Markword的锁标志位有什么作用? 偏向锁01 轻量级00 重量锁10
marwork这个文档写的很细介绍marwork
关于MarkWord面试相关MarkWord面试
3.1、Synchronized
3.2、分布式锁
我们通常使用的synchronized或者Lock都是线程锁,对同一个JVM进程内的多个线程有效。
因为锁的本质 是内存中存放一个标记,记录获取锁的线程是谁,这个标记对每个线程都可见。
然而我们启动的多个订单服务,就是多个JVM,内存中的锁显然是不共享的,每个JVM进程都有自己的锁,自然无法保证线程的互斥了,
这个时候我们就需要使用到分布式锁了。
常用的有三种解决方案,实现分布式锁要满足3点:多进程可见,互斥,可重入。
1.基于数据库实现
2.基于zookeeper的临时序列化节点实现
3.redis实现。
redis分布式锁跳转
4、线程
线程的基础概念和状态流程-跳转
线程睡眠的几种方式 跳转
创建线程-跳转
线程面试-跳转
线程变量 ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal) 跳转
Java创建线程的四种方式:跳转
线程面试题 跳转
5、线程池
6、连接池
利用线程池组合,搞定数据库连接池
连接池分类跳转
连接池Hikari源码分析:跳转
连接池-HikariCP面试点和小结 跳转
6、流
Java stream流 跳转
7、集合
HahsMap 跳转
HahsMap-面试用跳转
HashMap和Hashtable的区别 跳转
ConcurrentHashMap的数据结构,以及各个版本之间的区别跳转
ArrayList和LinkedList不同 跳转
8、限流
限流案例:
令牌桶限流实现案例:跳转
限流-Nginx[跳转](https://blog.youkuaiyun.com/weixin_37862824/article/details/122720840
限流-redis+Lua 跳转
9、基础
面试经常问的 跳转
加密算法 跳转
10、异常
异常汇总《跳转》
六、JVM
1、jvm基础
先了解下类的初始化和实例化 跳转
再看看 Java类加载的过程跳转
自定义类加载器-跳转
Jvm大纲 跳转
Jvm内存模型小结:跳转
OOM分析:跳转
编译和加载的区别《跳转》
编写的源文件.java, 编译成JVM能够识别的字节码.class文件,
字节码文件.class, 再经过JVM翻译成机器码, 并加载到内存中才能运行
2、加深
注:这里面问到的少,可以不用看,也有点乱,没空整理
java 创建对象的内存图解 跳转
常量池/运行时常量池/字符串常量池/基本类型常量池《常量池分类》
常量池和运行时常量池
比如定义一个变量 String a = "123" //编译完后的class文件是这样的,
a #3
#3在常量池中, 也就是说这里的#3就是符号引用。这些符号引用到加载到jvm(解析阶段)或者运行时(虚拟机栈的动态链接),才会变成直接引用。
编译的时候,常量池在class的文件中,当加载的时候,常量池会转成运行时常量池。
总结:
八大基本类型,只有String用了常量池基础
八大基本类型所对应的包装类型,也就是Integer,或者String的包装类Character也都使用了常量池技术,当初2个浮点型,所以这里一共有6个常量池,但是这个常量池的空间是分派在堆上面的。也就是说,String的常量池在方法区,另外6个常量池,在堆区。
所以要理解这四个东西:常量池、运行时常量池、字符串常量池、基本类型常量
常量池在字节码文件里面,也叫静态常量池,运行时常量池在方法区,字符串常量池在方法区,基本类型常量在堆。
3、Jvm面试
面试-内存模式的原子性、可见性、有序性 《原子性、可见性、有序性》
Jvm和垃圾回收算法-面试 《Jvm和垃圾回收算法-面试》
linux命令-获取应用JVM参数 跳转
linux命令-使用Jstack查询线程堆栈 跳转
七、缓存
本地缓存对比:《关于本地缓存你用过多少》
分布式缓存redis:跳转
Redis集群分类-跳转
Redis哨兵模式-主从选举算法-跳转
RedisCluster模式跳转
RedisCluster集群的配置-面试 跳转
九、中间件
9.1、zookeeper
zookeeper小结:跳转
zookeeper-分布式协同服务-大纲跳转
zookeeper-笔记-一致性算法跳转
9.2、MQ
Mq汇总跳转
过期消息处理机制跳转
延时消息实现原理跳转
Rocketmq 常用配置 跳转
9.3、Es
es 汇总 跳转
9.4、配置中心
nacos配置中心 跳转
apollo-springboot引入及如何使用 跳转
9.5 定时任务
定时任务E-Job和Xxl-Job对比 跳转
xxlJob源码分析-大纲《跳转》
xxlJob官方文档《跳转》
9.6 RPC
9.7 网关
RPC是什么,PRC有哪些框架上的实现《RPC汇总》
十、服务高可用
【注册中心】之间的区别以及【高可用】和【一致性】的区别: 跳转
一致性算法分类总结 《跳转》
限流算法+每个算法实现方案 跳转
十一、数据库
1、mysql
2、数据库分类
3、分页
多种分页的实现:跳转
十二、大数据框架
十三、Dubbo
Dubbo所有功能-汇总 跳转
十四、数据结构
十四、算法
4、排序算法-汇总 跳转
十五、Netty
BIO、NIO、AIO-汇总 跳转
十六、业务
支付业务汇总-跳转
秒杀系统业务-汇总-跳转
十七、面试题汇总
面试题-汇总跳转
十八、其他
开发常用稳定版本跳转
是什么JWT ? 《Json Web Token》
接口幂等+重复提交+失败重试跳转
项目开发规范跳转