技术栈
未读IOC
BeanDefinition
BeanDefinition 是 Spring IoC 容器的基石,它是 Bean 的一切元数据(类名、作用域、构造函数参数、属性等)的载体,是面向接口编程思想的体现。容器操作的是 BeanDefinition,而非直接操作 Class。
我们最常用的就是DefaultListableBeanFactory 中 beanDefinitionMap 这个 ConcurrentHashMap,所有加载的 BeanDefinition 都存储于此。
然后我们的IOC容器ApplicationContext 根据其实现(XML, Annotation)选择不同的策略(Reader, Scanner)来加载 BeanDefinition。模板方法模式在 AbstractBeanDefinitionReader 等类中被广泛使用。
XML 路径: 从 AbstractXmlApplicationContext 的构造函数出发 -> loadBeanDefinitions(new XmlBeanDefinitionReader(this)) -> X ...
美团
一面
题目1
请说明进程和线程的区别与联系。操作系统中的虚拟内存是如何实现的?谈谈乐观锁和悲观锁,以及它们在Java中的具体实现(如CAS、Synchronized)。AQS(AbstractQueuedSynchronizer)的原理是什么?请举例说明(如ReentrantLock)。当向一个线程池提交任务时,它的执行流程是怎样的?(考虑核心线程、队列、最大线程、拒绝策略)
介绍一下Redis的持久化机制有哪几种,它们各自有什么优缺点?如何保证缓存与数据库双写一致性?谈谈MySQL的事务隔离级别,以及MVCC是如何在可重复读(RR)级别下工作的。什么是覆盖索引和回表?在使用联合索引时,需要注意哪些最左前缀匹配原则?
请描述一下JVM的类加载过程,以及双亲委派模型。G1垃圾收集器相比于CMS有哪些优势?什么情况下会发生OOM(堆内存溢出),请举例说明几种场景。Java中的强引用、软引用、弱引用、虚引用之间有什么区别?
题目2
1:自我介绍
2:HashMap1.8底层数据结构和put流程
3:jvm底层和OOM发生区域
4:roc调用流程
5:慢SQL调查流程
6:mysql隔离 ...
线程
1.从 JVM 的角度来说一下线程和进程之间的关系
一个进程中可以有多个线程,多个线程共享进程的堆和**方法区 (JDK1.8 之后的元空间)*资源,但是每个线程有自己的*程序计数器、虚拟机栈 和 本地方法栈。
线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。线程执行开销小,但不利于资源的管理和保护;而进程正相反。
那么?为什么程序计数器、虚拟机栈和本地方法栈是线程私有的呢?为什么堆和方法区是线程共享的呢?
程序计数器:
主要作用:字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。如果执行的是 native 方法,那么程序计数器记录的是 undefined 地址,只有执行的是 Java 代码时程序计数器记录的才是下一条指令的地址。
so,程序计数器私有主要是为了线程切换后能恢复到正确的执行位置。
虚拟机栈和本地方法栈
...
索引
1.索引的分类
从数据结构上分类,B+树索引,hash索引,倒排索引,R树索引
从InoDB的B+树的索引分类,分为聚簇索引和非聚簇索引
从索引的性质进行分类,普通索引,主键索引,唯一索引,联合索引,全文索引,空间索引
锁&隔离级别
1.表级锁与行级锁的区别?
MySQL 常见的两种锁是表级锁和行级锁。
表级锁锁定整个表,所有对该表的读写操作都会被阻塞,适用于低并发场景;而行级锁锁定特定行,允许其他行的操作并发进行,适用于高并发场景。
表级锁粒度大,加锁快、开销小,但并发性能差,典型代表是 MyISAM。
行级锁粒度小,允许多个事务并发操作不同的行,并发性高,但锁的开销大,容易出现死锁,典型代表是 InnoDB。
因此实际使用时,MyISAM 适合读多写少的分析场景,而 InnoDB 的行级锁更适合高并发的 OLTP 系统。
2.MySQL 默认隔离级别?为何选择它?
MySQL 的默认隔离级别是可重复读(REPEATABLE READ)。选择这一隔离级别是因为它能够提供较高的数据一致性,防止不可重复读,并通过 MVCC(多版本并发控制)技术支持高效的并发性能。同时,通过 ...
Spring框架
1.SpringBoot的配置加载优先级
首先我们先确定一下配置加载优先级是按照我以下的顺序,由高到低的。分别是:
先是命令行参数(--server.port=9000 或 java -jar app.jar --spring.config.location=...)
然后是我们的系统的环境变量和JVM系统属性,比如设置端口为8080,比如我们在这里设置API的KEY
然后**RandomValuePropertySource**(random.* 占位符,用于生成随机数/字符串,可在配置中引用)
接着是外部配置文件(properties / yml)
JAR 包外部的 ./config/
JAR 包外部的 ./
JAR 包内部的 classpath:/config/
JAR 包内部的 classpath:/
接着是我们@PropertySource注解指定的配置
最后是我们Springboot默认的配置
然后在配置文件中,properties的配置大于yml,因为springboot是按加载顺序来的,后加载的prope ...
javase源码详解
1.==和equal()和hashcode
==和equals函数对于基本类型来说, = = 比较是值,equals不能比较基本类型
对于包装类型来说,== 比较的是对象的引用,就是对象的内存地址。而equals()通常被重写以比较对象的值。
需要注意的是,像Interger这种包装类具有缓存机制,如果在缓存的范围,==的结果可能就是true,因为他们都是指向常量池的同一个对象
对于引用类型来说,==比较的是其对象的内存地址,equals要分为两个情况,看这个类型到底重写了equals函数了没,重写了就按重写的比较,比如String类型,他的equals就是比较的对象的值。然后没有重写的话,equals内部还是使用 ==来比较。没有什么区别。还是比较的对象的内存地址
hashcode函数的作用是获取哈希码,然后确定该对象再hash表中的位置,比如hashmap,hashset,布隆过滤器等都用到了hashcode
hasecode分为好几种哈希函数,有取模的,有进行位运算的。我们在布隆过滤器中使用最好是使用两种hash函数来确定位的位置。
hashCode() 定 ...
技术栈应用
Nacos—服务注册
OpenFeign—RPC
Seata —分布式事务
真正内容设计亮点
基于 Sa-Token 构建统一 OAuth2 认证中心,实现账号密码、短信验证码、第三方平台(微信/支付宝/GitHub 等)等多种登录方式;通过自定义 Token 生成与权限控制,实现细粒度角色/权限管理;集成 Redis 实现分布式会话共享,支持多微服务统一认证与单点登录(SSO);结合注解与全局拦截器完成接口级鉴权,有效提升系统安全性与扩展性。
基于 Seata 分布式事务框架 实现跨微服务数据一致性保障,支持 AT/Saga/TCC 多事务模式;通过 Feign 拦截器实现全局事务上下文透传,结合异常分类回滚策略提升稳定性;引入事务监控与告警系统,支持事务状态实时追踪与自动补偿,显著降低人工介入成本。
设计并实现 基于 Spring Cloud Gateway 的全局认证过滤器,支持 JWT 多端统一认证、白名单动态管理、用户上下文透传;集成 Redis 实现 Token 黑名单与防重放攻击机制,提升系统安全性;引入链路追踪 ID 与异常告警体系,支持全链路请求跟踪与安 ...
基本概念
Spring Cloud 是一系列框架的有序集合。
Spring Cloud 利用 Spring Boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 Spring Boot 的开发风格做到一键启动和部署。
它将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过 Spring Boot 风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
Spring Cloud Netflix:重要组件之一,与各种Netflix OSS组件集成,组成微服务的核心。
Netflix Eureka:服务注册中心,云端服务发现,一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移。
Netflix Hystrix:熔断器,容错管理工具,旨在通过熔断机制控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。
Spring Cloud Config:配置中心,配置管理工具包,可以把配置放到远程 ...
面试回答优化
Gemini模拟面试2025.7.29
1.Java面向对象的基本特性:
总:的介绍一下java面向对象
分:封装,继承,多态
总:好处
2.Hashmap的原理
总:hashmap是个啥
分:
基本数据结构类型,1.7 or 1.8
hash冲突解决
核心put过程
扩容机制,为什么是2倍
线程安全实现
concurrenthashmap
平时使用场景
3.ArrayList 和 LinkedList 的区别
底层数据结构
插入删除遍历节点
扩容
使用场景:
4.常用的设计模式
单例:饿汉式,懒汉式,DCL 枚举 实际应用,RedisClient AppConfig Spring bean
策略:
模板
观察
工厂
5.ThreadLocal的实现
底层数据结构
Threalocal涉及两个组件,一个是他对象本身负责set和get
然后一个ThreadLocalMap负责数据的存储,每一个线程都持有一个ThreadLocalMap他就是副本。是线程隔离的,不会有并发的线程不安全问题
ThreadLocalMap是Thread下 ...
他人面经
1.spring的底层实现&三级缓存原理
我们先来说三级缓存的实现吧
首先三级缓存是那三个缓存呢?是在DefaultSingletonBeanRegistry类里面定义的三个Map。然后第一第二层都是key是bean的名字,value是bean的实例。第三次key是bean的名字,value是objectfactory.
第一层缓存是用来存储我们已经完全实例化好的bean,在这里可以直接使用的
第二层缓存时用来存储我们早期的bean,创建好,但是并没有进行依赖注入的
第三次缓存是用来存储我们的objectfactory的,用来创建代理对象的
然后我们缓存的核心方法是我们的getSingleton方法,他定义了我们如何去获取缓存的顺序
我们首先先去看第一层缓存,如果第一次没有且bean正在创建中的话。我们再去找第二层缓存,第二层也没有的话,允许早期引用。然后从三级缓存中获取objectfactory
然后使用objectfactory来创建对象,这里可能是代理对象。因为比如AOP,或者使用了其他的代理模式
然后将其升级到二级缓存,将三级缓存里面的删除。(暂不使用,然后再 ...













