本博客文章汇总

该博客围绕Java后端开发展开,涵盖Spring、MyBatis、Servlet等框架,涉及反射、代理、锁等Java基础,还包括JVM、缓存、中间件等知识。同时介绍了数据库、大数据框架、Dubbo等内容,最后汇总了面试题及其他开发相关知识。

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

一、Spring

1、spring生命周期跳转

2、了解下FactoryBean和BeanFactory的区别 跳转

3、Spring三级缓存梳理 跳转

4、Cglib代理和JDK代理原理的区别 跳转

5、在看看Spring是如何处理@Autowired、@Resource注解及区别 跳转

6、Spring必须要了解的几个《后置处理器》跳转

6、Spring如何处理@Import注解

《@Import(普通类)》

《@Import(ImportSelector)》

《@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.classRequestMapping.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

Eureka常用配置 跳转
Eureka源码流程 跳转

2、ribbon

ribbon原理 跳转

3、hystrix

hystrix功能汇总 跳转
Sentinel功能介绍以及和Hystrix的差异 跳转

4、Feign

Feign相关介绍跳转

二、Mybatis

流程图:跳转

1、先了解下Mybatis的启动流程,熟悉下Mybatis重要的几个类《mybatis执行流程1》
《mybatis执行流程2》


Mybatis
1、配置转成Configuration
2Configuration得到SqlSessionFactory(创建JdbcTransactionFactory,由JdbcTransactionFactory
得到JdbcTransactionJdbcTransaction得到CachingExecutor3SqlSessionFactory得到SqlSession
4SqlSession得到代理对象MapperProxyMapper转成MapperProxyFactoryMapperProxyFactory.getObject
创建【Mapper接口】的代理对象MapperProxy5MapperProxy里面有SqlCommand+Method
6、通过MapperProxy执行方法。

Mybatis整合Spring
1SqlSessionFactoryBean(需要DataSource配置)
2SqlSessionFactoryBean得到SqlSessionFactory
3SqlSessionFactory得到SqlSessionTemplate
4SqlSessionTemplate包含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

设计模式-责任链设计模式1
设计模式-责任链设计模式2

3、AOP

适配器设计模式

类加载

双亲委派模型

Spring中常用的设计模式 【跳转】
所有设计模式作用和优点小结:【跳转】

五、Java基础

1、反射

聊聊关于反射 跳转,再看看反射的面试都问些什么 跳转

2、代理

动态代理和静态代理 跳转

代理总结 跳转

3、锁

什么是锁 跳转
并发高性能LongAdder类 跳转
并发高性能LongAccumulator类 跳转

AQS原理 跳转
AQS面试 跳转

公平锁和非公平锁 跳转
AQS小结跳转

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

Synchronized实现原理

3.2、分布式锁

我们通常使用的synchronized或者Lock都是线程锁,对同一个JVM进程内的多个线程有效。
因为锁的本质 是内存中存放一个标记,记录获取锁的线程是谁,这个标记对每个线程都可见。
然而我们启动的多个订单服务,就是多个JVM,内存中的锁显然是不共享的,每个JVM进程都有自己的锁,自然无法保证线程的互斥了,
这个时候我们就需要使用到分布式锁了。

常用的有三种解决方案,实现分布式锁要满足3点:多进程可见,互斥,可重入。
1.基于数据库实现 
2.基于zookeeper的临时序列化节点实现 
3.redis实现。

redis分布式锁跳转

4、线程

线程的基础概念和状态流程-跳转

线程睡眠的几种方式 跳转

创建线程-跳转

线程面试-跳转

线程变量 ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal) 跳转

Java创建线程的四种方式:跳转

线程面试题 跳转

5、线程池

线程池 跳转
线程池种类汇总跳转

线程池面试用 跳转
线程池高级面试

forkjoinpool和线程池的区别

6、连接池

利用线程池组合,搞定数据库连接池

连接池分类跳转

连接池Hikari源码分析:跳转
连接池-HikariCP面试点和小结 跳转

6、流

Java流

Java stream流 跳转

7、集合

Java集合汇总跳转
面试-线程安全集合跳转

HahsMap 跳转
HahsMap-面试用跳转
HashMap和Hashtable的区别 跳转
ConcurrentHashMap的数据结构,以及各个版本之间的区别跳转

ArrayList和LinkedList不同 跳转

8、限流

漏桶和令牌桶的区别跳转
02高并发系统-限流 跳转

限流案例:
令牌桶限流实现案例:跳转
限流-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 创建对象的内存图解 跳转

常量池/运行时常量池/字符串常量池/基本类型常量池《常量池分类》

《成员变量、静态成员变量、局部变量、常量的内存区域》

常量池和运行时常量池区别1
常量池和运行时常量池区别2

常量池和运行时常量池
比如定义一个变量 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小结:跳转

zk自己整理的面试题

zookeeper-分布式协同服务-大纲跳转
zookeeper-笔记-一致性算法跳转

zookeeper-笔记-命令跳转
一致性算法图跳转

9.2、MQ

Mq汇总跳转

延时消息实现算法《跳转》
延时消息实现超时关单《跳转》

过期消息处理机制跳转
延时消息实现原理跳转
Rocketmq 常用配置 跳转

kafka、rocketMq消息游有序
Mq面试题

9.3、Es

es 汇总 跳转

9.4、配置中心

Nacos实现动态更新-小结

nacos配置中心 跳转

apollo-springboot引入及如何使用 跳转

9.5 定时任务

定时任务E-Job和Xxl-Job对比 跳转

xxlJob源码分析-大纲《跳转》
xxlJob官方文档《跳转》

9.6 RPC

RPC相关概念

9.7 网关

网关

RPC是什么,PRC有哪些框架上的实现《RPC汇总》

十、服务高可用

高可用、高并发、高性能-跳转

【注册中心】之间的区别以及【高可用】和【一致性】的区别: 跳转

CAP理论-跳转

一致性算法分类总结 《跳转》

限流算法+每个算法实现方案 跳转

十一、数据库

1、mysql

mysql汇总地址

2、数据库分类

数据库分类

3、分页

多种分页的实现:跳转

十二、大数据框架

Flink-汇总

十三、Dubbo

Dubbo所有功能-汇总 跳转

Dubbo的通信协议

十四、数据结构

数据结构-汇总

十四、算法

1-回文算法题
2-复杂算法实现
3、分布式选举算法

4、排序算法-汇总 跳转

十五、Netty

BIO、NIO、AIO-汇总 跳转

十六、业务

支付业务汇总-跳转

秒杀系统业务-汇总-跳转

shartId-业务汇总

十七、面试题汇总

面试题-汇总跳转

十八、其他

开发常用稳定版本跳转

是什么JWT ? 《Json Web Token》

接口幂等+重复提交+失败重试跳转

常用的第三方类库

项目开发规范跳转

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信仰_273993243

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值