目录
基本原则:
Java官方文档:
0.对系统做过的优化
(1).企微访问功能优化
(2).Redis缓存分布式锁使用优化
(3).JVM Full GC过于频繁
1.Redis
Redis集群原理详解_张维鹏的博客-CSDN博客_redis集群读写分离原理
(0).Redis与lua预防库存超卖--重要
(1).Redis做分布式锁,用到哪些命令
(2).Redis持久化
(3).Redis缓存过期,并发排他
(4).Cache-aside模型相关
(5).Redis优化策略
(6).Redis重复消费和消息丢失
2.内存溢出的情况:
(1).IT老齐的视频
(2).内存溢出分类:
(3).线上项目突发OOM ?如何快速定位OOM问题 ?
3.安全方面:
1.CSRF攻击
2.XSS攻击
4.SpringCloud版本, SpringBoot版本, RabbitMQ版本
5.React 生命周期,高阶组件, js原型,继承
6.微服务监控 SpringBoot Admin
7.微服务调用链路监控
8.IO相关:
9.索引失效的8种情况:
10.SpringMVC
1.SpringMVC的工作流程:
2.SpringMVC9大组件:
3.servlet工作原理:
4.SpringMVC基础知识
11.服务熔断与降级:
12.动态规划算法: 10级台阶
13.Ribbon的负载均衡策略及原理
14.分布式事务:
1.seata 详解:
2.多线程实现二阶段提交:编程式事务
15.谈谈服务雪崩、降级与熔断
16.WebSocket实现原理
17. mybatis 从头到尾
18. hibernate 从头到尾
19. sharding-jdbc 事务问题
20. java 8 与 java 11的区别:
21.mybatis mapper是怎样实例化的?
[转]Java 动态代理机制分析及扩展_dgt21030的博客-CSDN博客
22.SpringCloud微服务治理框架
23.React Route中的switch 作用是什么?
24.怎样设计一个高并发系统?
25.Springcloud gateway配置与使用
26. 微服务划分-DDD领域驱动---重要
27. CAS是什么? 它的缺点是什么?
28. Spring声明式事务@Transaction
29.持续集成,持续交付,持续部署:
持续集成、持续交付、持续部署(CI/CD)简介_yuanjunliang的博客-CSDN博客_持续交付
30.java 异常体系:
31.算法
32.mysql, mongodb, redis等数据库的区别:
33.IAAS, PAAS, SAAS这些概念也要掌握
34.Spring IOC的理解,循环依赖的解决(重要)
39. RabbitMQ, Kafka
40.Springboot 事务使用以及失效情况(重要):
41.微服务扩展AKF理论:
42.关于hash哈希算法:
43.函数式编程:
44.内存泄漏:
45.线程:
46. 动态代理实现方式
47.多线程之间是如何通信的?
48.AQS
49.多线程之间是如何通信的?
编辑
50. CAP与BASE理论
51.响应式编程 到 WebFlux:
52.K8s面试题:
53.怎样实现乐观锁?
54.jwt与https
55. mysql - redo log, binlog等log相关(重要)
56.Spring AOP
57.Mysql长事务:
58.Springboot 自动装配:
59.分布式-RPC
各种知识点,以及对应的会出现的问题和其局限性,及怎样解决。还有就是同一种组件的横向比较
例如CAS,以及使用CAS会出现的问题:ABA问题,自旋会消耗CPU问题,只能锁定一个变量的局限性问题。
Redis使用过程中会遇到的缓存穿透,缓存击穿,缓存雪崩,缓存满了以后的淘汰策略等。
数据库索引使用过程中会遇到的索引失效,怎样查看索引使用情况的explain等。
MQ的各种实现的横向比较,各种数据库的横向比较等。
重要:
先要知道MQ这种组件整体的优点和缺点,然后是Kafka,RabbitMQ,RocketMQ的优缺点,这样才能很好的选型,这是非常重要的
详解MQ消息队列及四大主流MQ的优缺点 - 知乎 (zhihu.com)
记录一下可能被问到的知识点
1.spring源码,用到了哪些设计模式
Spring中用到的设计模式_困知勉行1985的博客-CSDN博客
其它设计模式相关:或者叫java系统设计原则
java 7大设计原则_java七大原则_ジ你是我永远のbugグ的博客-CSDN博客
2.JVM优化: 预优化、卡顿、出问题怎么办,还有就是做过什么优化,举例说明
JVM相关文章:【深入Java虚拟机】之一:Java内存区域与内存溢出_兰亭风雨的专栏-CSDN博客_java内存区域与内存溢出
3.写到简历里的东西,最好都做好相关知识点的准备,如果被问到,却答不上来,会很尴尬
4.React 函数式组件和类组件的区别
5.重要:在项目中遇到过什么难题?怎样解决的?多准备几个,自己上网搜,比如内存问题,线程问题等等吧
具体知识点:
Java Platform, Standard Edition Documentation - Releases (oracle.com)
Home: Java Platform, Standard Edition (Java SE) 8 Release 8 (oracle.com)
What's New in JDK 8 (oracle.com)
JDK 11 Release Notes, Important Changes, and Information (oracle.com)
企微功能的代码,每次访问企微后台,都需要重新获取access token,这样会导致频繁获取access token,而企微后台对获取access token的频率是有要求的,过于频繁会受到拦截
怎样解决这个问题呢?
在并发量大的时候,肯定会导致频繁获取access token,其实可以在获取到access token后,根据返回信息里的过期时间,在redis里面加一个key,存储这个access token,过期时间设置为返回信息里的过期时间;如果是单应用架构,不是分布式架构,也可以在本地缓存中存储一个有过期时间的jwt,jwt中的payload部分包含了企微的access token,jwt的过期时间就是企微access token的过期时间
使用redis缓存的时候,如果发生缓存击穿或者没有预热的情况,并发来了,需要先让其中一个请求获取redis分布式锁,然后访问数据库,将数据放到redis缓存,其它请求从redis缓存中获取数据,这篇文章做了总结:
Redis cache-aside模型-分布式锁等问题研究_redis cache aside_知难行难1985的博客-CSDN博客
在压力测试过程中,将并发量打到1000,系统JVM Full GC垃圾回收过于频繁,基本上15秒钟进行一次Full GC,这个问题必须解决,非常影响系统性能,查看应用运行log,没有发现OOM错误,那么只能通过增加堆内存的方式,降低Full GC,经过测试,将堆内存设置为3G以后,Full GC几乎检测不到,详情可以参考文章:
JVM调优总结--压力测试_jvm压测_知难行难1985的博客-CSDN博客
核心就是减库存的时候保证原子性,使用lua脚本保证原子性,通过lua代替分布式锁解决超卖,效率更高,更快。
【IT老齐123】爆赞!商品秒杀巧用Redis与Lua预防库存超卖~_哔哩哔哩_bilibili
怎样保证高可靠??
问题:我在之前的面试被问到过相同的问题 我给出的解决方案也是通过lua代替分布式锁解决超卖,面试官后来又问既然是大平台秒杀单台肯定支撑不住,集群的话主从一致性怎么保证呢,如果要求主从强一致又损失了性能
答案:lua是支持Redis Cluster集群的,通过{}实现指定key稳定在集群的同一个slot中,这样不会出现因为key分桶带来的一致性与原子性问题。至于主从,本身redis为了保证效率采用的AP设计就是最终一致性的。你反问他:只有在主节点垮掉小部分数据没能同步到从节点才会出现少部分数据丢失,你为了0.1%可能的概率选择放弃效率选择每一次处理强一致,那为什么还要选择AP的redis呢,而且对于此类丢失的少量数据后台跑个线程进行补偿不就行了?
使用nx, 只有在key不存在的时候,才能set成功
使用ex,为锁设置过期时间
set key value nx ex 10s
Redisson工作原理:实现了可重入锁,用的数据类型是hmap
Redisson加锁解锁中解锁的过程用的就是lua脚本,保证解锁过程的原子性,因为解锁过程分为2步,第一步先查询出value,根据这个value判断出是否是自己加的锁,防止误删别人的锁,第二步再删除这个key,在java端,这就是2步了,不能保证原子性,并发的情况下,这个key的value值可能发生了变化,但是仍然会被删掉。所以用lua脚本去解决这个问题,lua脚本可以执行多步,但是lua脚本是在redis中执行的,redis是用单线程执行指令队列的,指令队列中可以是redis的正常指令,也可是lua脚本。
可重入锁:hmap的value值代表了重入的次数
RDB全量,AOF增量
Redis面试必问:Redis持久化rdb和aof_哔哩哔哩_bilibili
RDB用到的copy on wirte技术:
【死磕 Java 基础】 — 谈谈那个写时拷贝技术(copy-on-write) - 知乎 (zhihu.com)
如果一个key过期,但是有大量并发请求过来,怎么办? 加锁(多个client抢锁,所以加分布式锁),只让一个请求到达数据库,拿到数据后,添加到缓存,然后释放锁,其它线程直接从缓存拿数据,避免大量请求同时达到数据库,给数据库造成压力。
缓存穿透、缓存击穿、缓存雪崩的区别 - PC君 - 博客园 (cnblogs.com)
Redis cache-aside模型研究_知难行难1985的博客-CSDN博客
Redis性能调优策略 - lcl-mm - 博客园 (cnblogs.com)
【Kafka】Kafka的重复消费和消息丢失问题_童话ing的博客-CSDN博客_kafka消息丢失和重复消费
列出5种就可以了
重要:IT老齐讲述的排查OOM并最终解决的方案:
【IT老齐043】IT老齐线上Java OOM排查与解决过程分享(下)_哔哩哔哩_bilibili
以及下面这个Error:
SpringSecurity 怎样阻止跨域攻击CSRF。
这篇文章写得不错:
SpringSecurity (4) CSRF 与 CSRF-TOKEN 的处理_O_o-CSDN博客
CSRF攻击-视频:
https://www.bilibili.com/video/BV1iW411171s/?spm_id_from=333.999.0.0&vd_source=bad1d35f8fbfa2b52a4d43328c042500
XSS攻击--视频
https://www.bilibili.com/video/BV1DW411U7XE/?spm_id_from=333.999.0.0&vd_source=bad1d35f8fbfa2b52a4d43328c042500
相关的响应式编程(异步编程):
一文带你彻底了解Java异步编程 - 知乎 (zhihu.com)
Hoxton -> 2.2.x
Greenwich -> 2.1.x
Finchley -> 2.0.x
Edgware -> 1.5.x
Dalston -> 1.5.x
MongoDB 4.0 1个primary,2个secondary
Redis 4.0 内存8G, 单机
RabbitMQ 3.7.17 单机(如果要用集群的话,集群分为普通集群和镜像集群)
Kafka:2.13
mysql版本:MySQL 5.6.51 ,华为云数据库RDS
k8s集群版本 : v1.19
docker版本:18.09,客户端和服务端都是18.09
JS原型:https://segmentfault.com/a/1190000021232132
深入理解javascript原型和闭包(完结) - 王福朋 - 博客园https://www.liaoxuefeng.com/wiki/1022910821149312/1023022043494624深入理解javascript原型和闭包(完结) - 王福朋 - 博客园
继承的几种方式:
三个属性:__proto__、prototype、 constructor
也就是说构造函数比普通对象多了一个属性prototype
除了springboot admin, 还有普罗米修斯等,它们都是基于actuator这个信息采集工具,actuator被集成在微服务中。
Spring Actuator 与 Spring boot Admin_Jack汪喆的技术分享栏-CSDN博客_actuator和admin
现在使用skywalking
字节流和字符流的区别,字节流没有使用缓冲区,所以直接操作文件
https://blog.csdn.net/chenkaibsw/article/details/81606722
BIO,NIO, AIO,响应式编程等概念:
深度长文:从bio到nio到aio,再到响应式编程_小姐姐味道的博客-CSDN博客
一文带你彻底了解Java异步编程 - 知乎 (zhihu.com)
Netty默认线程数是2*N+1:
Netty肯定是IO密集型,CPU密集型的话,线程数是N+1
netty源码分析之nio线程个数以及线程命名规则_小潭渔的博客-CSDN博客_netty 线程数量
重要:里面有响应式编程内容:
一文带你彻底了解Java异步编程 - 知乎 (zhihu.com)
同步、异步:
阻塞、非阻塞是指线程是否挂起,同步异步是指线程是否亲自去读写数据(用户空间和内核空间之间),同步是需要线程亲自去读写数据,异步的话不需要,衣来伸手饭来张口。
下面这篇文章解释得非常好。
为什么nio是同步非阻塞的 - CSDN
备份:为什么NIO被称为同步非阻塞_知难行难1985的博客-CSDN博客
重要----阿里慢sql挑战大赛案例讲解---IT老齐:
【IT老齐044】190毫秒干到2毫秒!?2017阿里云SQL优化挑战赛实战分享_哔哩哔哩_bilibili
servlet面试相关_知难行难1985的博客-CSDN博客
全局异常 控制怎样实现? @NotNull @NotEmpty注解是怎样起作用给的
https://blog.csdn.net/wdquan19851029/article/details/121075166
https://blog.csdn.net/u013099854/article/details/104005947
https://blog.csdn.net/qq_35190492/article/details/108000380
面试官问我知道的分布式事务,我一口气说了六种_敖丙-CSDN博客
sharding-jdbc+seata实现分库分表,多数据源整合和seata分布式事务_HTslide的博客-CSDN博客
Seata AT模式的全局锁GlobalLock - hongdada - 博客园 (cnblogs.com)
重要:徐庶讲解SETA各种模式的实现
小米二面:分布式事务有哪些解决方案 ?你们项目中用的是那一种 ?_哔哩哔哩_bilibili
https://www.bilibili.com/video/BV1yD4y1L7X6/?spm_id_from=333.999.0.0&vd_source=bad1d35f8fbfa2b52a4d43328c042500
https://www.bilibili.com/video/BV1v8411E7Kh/?spm_id_from=333.788&vd_source=bad1d35f8fbfa2b52a4d43328c042500
https://blog.csdn.net/fujiandiyi008/article/details/88015295
sharding-jdbc+seata实现分库分表,多数据源整合和seata分布式事务_HTslide的博客-CSDN博客
面试官问我知道的分布式事务,我一口气说了六种_敖丙-CSDN博客
JAVA 8与JAVA 11到底该怎么选?_A16670113506的博客-CSDN博客_java11和java82
还是要熟悉mybatis原理才行。
Mybatis四大对象,说一下对它们的理解
关于mybatis的一个疑惑(Mapper接口如何实例化的)_tanqidong1992的专栏-CSDN博客_ibatis mapper如何实例化
JDBC:深入理解PreparedStatement和Statement_Marvel__Dead 胡艺宝的博客-CSDN博客_jdbc preparedstatement Mybatis源码分析第一讲之Mybatis概述 - 田俊哲的博客 | Shmilyz Blog
Tags - 田俊哲的博客 | Shmilyz Blog
微服务方面还是要仔细看的。各种组件,相同功能组件的比较与优缺点
(1).有
(2).无
结论:为了更好地匹配规则,轻易不要舍弃
react-router中,
mysql每秒支持多少并发_如何设计一个高并发系统?_weixin_39996035的博客-CSDN博客
Spring cloud gateway 详解和配置使用(文章较长)_荡漾-CSDN博客
微服务拆分_wdquan19851029的专栏-CSDN博客
CAS的缺点及解决 - 知乎
有没有回滚失败的情况?肯定是有的
1. 因为默认声明式事务默认回滚RuntimeException及其子类,如果不是RuntimeException, 则不会回滚,例如ParseException IO Exception等,该怎么办呢? 可以设置参数rollback = Exception.class让其回滚所有异常。
2. 如果在方法内用try catch捕获了异常,导致框架无法感知异常,也会导致事务无法回滚,所以若非业务要求这样做,则应该在业务层统一抛出异常,然后再控制层统一处理。
持续集成、持续交付、持续部署_purpose的博客-CSDN博客_持续集成和持续交付
都是继承于throwable类,分为Error和Exception, 其中Error是不能捕获的,Exception是可以捕获的,但是Exception中的runtimeException及其子类是不需要捕获的(例如nullpointerException, 数组越界等), 其它种类的比如IOException是必须捕获的。
1.八大排序算法,及其变种:
除了要掌握基本算法,还要掌握其变种,例如一万数据的数组,怎样最快获取它的最小的100个,采用哪种算法?冒泡或者快排,堆排序还是其它?
2.分布式系统中生成唯一自增ID的雪花算法
3.Redis缓存删除算法: 例如LRU, LFU算法
一张图看懂IaaS, PaaS和SaaS的区别_IT精选-CSDN博客_iaas paas saas
没看过怎么办?
Bean生命周期:
Bean生命周期:
循环依赖:
重要:详解MQ消息队列及四大主流MQ的优缺点 - 知乎 (zhihu.com)
重要:kafka消费的完整解决方案 - 知乎 (zhihu.com)
RabbitMQ的队列怎样持久化等等,通过页面配置,在Springboot中怎样配置??
RabbitMQ介绍_游王子的博客-CSDN博客_rabbitmq介绍
这几篇文章不错 ,详细讲述了在springboot中的使用:
rabbitMQ 可靠性消息投递_angen2018的博客-CSDN博客_rabbitmq可靠性投递解决方案
备份:rabbitMQ 可靠性消息投递_知难行难1985的博客-CSDN博客
rabbitmq ACK消费者确认机制_angen2018的博客-CSDN博客_rabbitmq消费者确认机制
备份: rabbitmq ACK消费者确认机制_知难行难1985的博客-CSDN博客
RabbitMQ崩溃恢复后消息的恢复:
RabbitMQ 的消息持久化与 Spring AMQP 的实现详解 - java框架 - 谷谷点程序 (3qphp.com)
备份:RabbitMQ 的消息持久化与 Spring AMQP 的实现详解_知难行难1985的博客-CSDN博客
RabbitMQ死信队列研究:
RabbitMQ的死信队列详解_知难行难1985的博客-CSDN博客
RabbitMQ 消息有效期问题_天怎么不会塌的博客-CSDN博客_rabbitmq消息过期无效
SpringBoot事务隔离等级和传播行为 - zincredible - 博客园 (cnblogs.com)
SpringBoot使用@Transactional_flyaway86的博客-CSDN博客_springboot transactional
事务无法回滚的两种情况:
与DDD领域驱动开发有什么区别?
分布式AKF拆分原则 - -零 - 博客园 (cnblogs.com)
很多框架中,包括分布式和非分布式框架,都要用到哈希取模运算,例如nginx,kafka等,所以有必要好好研究一下hash算法。
Lambda表达式与函数接口
Java函数式编程_打工人你好的博客-CSDN博客_java函数式编程
Java中的lambda每次执行都会创建一个新对象吗 - 云+社区 - 腾讯云 (tencent.com)
Java中的函数式编程_java_脚本之家 (jb51.net)
1.InputStream, OutputStream等各种输入输出流未关闭导致的内存泄漏
2.ThreadLocal set之后,线程执行完之前,必须要将set的值remove掉,不然也会内存泄漏,虽然ThreadLocal里面用的软引用。
线程池自定义线程名称:
(1条消息) java自定义线程池名称_zquwei的博客-CSDN博客_java 线程池命名
重要:
Java中各种死锁详细讲述及其解决方案(图文并茂,浅显易懂)_李子捌的博客-CSDN博客_java 死锁
Java 线程死锁及如何避免死锁介绍_阿布~的博客-CSDN博客_java线程死锁
Java多线程 开发中避免死锁的八种方法_java持续实践的博客-CSDN博客_实际开发中如何避免死锁
动态代理proxy与CGLib的区别_茅坤宝骏氹的博客-CSDN博客_proxy和cglib
cap理论与base理论_月上柳梢头。的博客-CSDN博客_cap理论
[分布式]:分布式系统的CAP理论_Franco蜡笔小强的博客-CSDN博客_分布式cap
WebFlux 详解_程序猿秃头之路的博客-CSDN博客_webflux
K8S面试题总结_孤独天狼的博客-CSDN博客_k8s面试题
改造表结构,增加版本号字段,更新数据库记录的时候,先查询出来获取版本号,然后更新数据,更新数据的sql中增加版本号判断,例如update my_table set name="bruce" version=version+1 where id=10 and version=11。如果因为并发导致版本号变更,从而更新失败的话,那么可以利用spring自带的重试机制,重试几次,如果全部重试失败,则返回异常信息到前端。
悲观锁:
乐观锁:
版本被别的并发事务修改后,应该怎么办?直接返回失败的话,那么会影响用户体验,这时候可以使用spring-retry机制,重试几次
这样可以使得我们web容器的线程池的连接处于低水位的情况,对于系统的健壮性是有好处的。
【IT老齐025】无状态的JWT令牌如何实现续签功能?_哔哩哔哩_bilibili
1.java提供了jjwt这个工具来生成jwt和校验jwt,jjwt利用秘钥给数据生成签名,把标头header,playload(荷载信息和header可以使用base64进行加密,所以不需要私钥也可以直接base64解密获得),数字签名组合在一起生成jwt,然后返回给客户端的浏览器等进行保存。然后用户访问服务器的时候,带上jwt,服务器的jjwt会利用秘钥对jjwt进行校验(验签),如果jwt被篡改了,那么校验肯定是失败的。
因为秘钥只在服务器端,jwt的生成和校验都在服务器端,秘钥不会泄漏给用户,jwt只是证明你登录过了,如果用户随便编造一个jwt想证明自己登陆过,这是行不通的。
而https能够保证用户登录后获取到的jwt本身不会被黑客截获,jwt和https起的作用不一样,二者配合保证了系统安全。
2.建议将哈希(Hash),加密(Encrypt),签名(Sign)特殊区分一下,每种使用的场景和安全性是不同的,JWT只是使用了签名,所以不能保存敏感数据。
3.jwt返回前端后,比如浏览器,可以保存到cookie localstorage/sessionStorage,但是为了防止CSRF攻击,发送请求的时候,后端不要从cookie中获取jwt,而应该从前端请求的参数或者自定义的header中获取token,也就是说前端发送请求的时候,要把jwt取出来,然后放到请求的header中(非cookie这个header,可以是自己命名的header),或者放到请求参数中。
4.我们现在是把权限信息丢redis里的,网关统一根据token推导出用户id.然后每个具体的方法根据请求里的用户id去redis里拿角色这种东西。
5.后端决定token(jwt)在cookie中domain和path
下面代码中为response设置了一个cookie,并且设置了该cookie的domain和path属性
private void addToken(HttpServletResponse response, String token) {
Cookie cookie = new Cookie(SSOConstants.TOKEN_KEY, token);
cookie.setDomain(routerProperties.getHostMasterDomain());
cookie.setPath("/");
cookie.setMaxAge(24 * 60 * 60);
response.addCookie(cookie);
}
还可以设置该cookie的过期时间属性
1.redo logb 与 inlog怎样保证一致性 --- 二阶段提交过程(重要)
MySQL更新数据时,日志(redo log、binlog)执行流程_mysql事务回滚会产生binlog吗_知难行难1985的博客-CSDN博客
2.log工作原理:
(1条消息) mysql log理解_知难行难1985的博客-CSDN博客_mysql的log
基础知识:写得很好
(2条消息) Spring AOP 前置通知、返回通知、异常通知、后置通知、环绕通知_saltsoul的博客-CSDN博客
重要视频:
Spring面试必问:Spring的事务是如何回滚的?_哔哩哔哩_bilibili
写的不错:
MySQL-长事务详解 - MySQL技术 - 博客园 (cnblogs.com)
这篇文章不错:SpringBoot 自动装配流程以及核心源码剖析_springboot自动装配过程-CSDN博客
(1).基础知识
springboot的自动装配是利用了spring IOC容器创建过程中的增强功能,即BeanFactoryPostProcessor, 其中的ConfigurationClassPostProcessor实现了BeanFactoryPostProcessor接口,在其中具体完成了springboot的自动装配过程,这个后置处理器会解析注解信息,启动类上有SpringbootApplication注解,这是一个复合注解,里面包含了@EnableAutoConfiguration注解
@EnableAutoConfiguration注解中import了一个ImportSelector类AutoConfigurationImportSelector,调用这个类里面的方法getAutoConfigurationEntry -> getCandidateConfigurations从第三方组件的META-INFO/spring.factories文件中获取到配置类,并生成对应的BeanDefinition,然后继续走spring的流程去生成bean。
(2).具体代码的执行流程
springboot main方法 -> SpringApplication.run
prepareContext方法完成SpringBoot项目的xxxApplication的BeanDefinition的注册;refreshContext通过spring的注解扫描完成自动装配。
然后执行refreshContext(context)方法,进入到spring框架的refresh(....)方法:
调用invokeBeanFactoryPostProcessors(beanFactory)去执行注册好的所有BeanFactoryPostProcessor,其中就包括ConfigurationClassPostProcessor,由它去完成自动装配。具体是有ConfigurationClassParser这个类去完成的,它是所有配置类(加了注解的类@Configuration)的解析类。
所有的解析都在其方法parse(......)中,会调用processImports(......)方法去解析@Import注解,拿到import注解里面配置的类AutoConfigurationImportSelector.class
上面通过解析@Import注解,拿到类AutoConfigurationImportSelector之后,调用这个类里面的方法getAutoConfigurationEntry -> getCandidateConfigurations从第三方组件的META-INFO/spring.factories文件中获取到配置类,并生成对应的BeanDefinition,然后继续走spring的流程去生成bean。
OpenFeign:
(1条消息) FeignClient注解中的contextId的使用场景,以及解决了什么样的问题_长了脚の妖怪的博客-CSDN博客_feign contextid