当前位置: 首页 > news >正文

Spring IOC

 ◆ 传统Javaweb开发的困惑

 

◆ IoC、DI和AOP思想提出

◆ Spring框架的诞生

Spring | Home

 

 

IOC控制反转:BeanFactory 快速入门 

 

package com.xiaolin.service.Impl;import com.xiaolin.dao.UserDao;
import com.xiaolin.service.UserService;public class UserServiceImpl implements UserService {//该方法是BeanFactory去调用该方法  从容器中获取userDap设置到此处public void setUserDao(UserDao userDao) {System.out.println("该方法是BeanFactory去调用该方法  从容器中获取userDap设置到此处"+userDao);}
}
package com.xiaolin.service;public interface UserService {
}
public class BeanFactoryTest {public static void main(String[] args) {//创建工厂对象DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();//创建一个读取器(xml文件)XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);//读取器配置文件给工厂reader.loadBeanDefinitions("beans.xml");//根据id获取Bean实例对象UserService userService = (UserService) beanFactory.getBean("userService");
//        System.out.println(userService);}
}

DI依赖注入:BeanFactory 快速进阶(在一个bean对象中嵌套另一个bean对象)

 

package com.xiaolin.dao.Impl;import com.xiaolin.dao.UserDao;public class UserDaoImpl implements UserDao {
}
package com.xiaolin.dao;public interface UserDao {
}
public class BeanFactoryTest {public static void main(String[] args) {//创建工厂对象DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();//创建一个读取器(xml文件)XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);//读取器配置文件给工厂reader.loadBeanDefinitions("beans.xml");//根据id获取Bean实例对象UserService userService = (UserService) beanFactory.getBean("userService");
//        System.out.println(userService);UserDao userDao = (UserDao) beanFactory.getBean("userDao");
//        System.out.println(userDao);}
}

 - ApplicationContext快速入门

 

package com.xiaolin.test;import com.xiaolin.service.UserService;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class ApplicationContextTest {public static void main(String[] args) {ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");UserService userService = (UserService) applicationContext.getBean("userService");System.out.println(userService);}
}

 applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--    配置UserServiceImpl--><bean id="userService" class="com.xiaolin.service.Impl.UserServiceImpl"><property name="userDao" ref="userDao"></property></bean>
<!--    配置UserDao将userDao设置给userService
--><bean id="userDao" class="com.xiaolin.dao.Impl.UserDapImpl"></bean>
</beans>

 BeanFactory与ApplicationContext的关系

 

 

 

BeanFactory的继承体系 

ApplicationContext的继承体系 

 

 

 

◆ 基于xml的Spring应用

- SpringBean 的配置详解

 1)Bean的基础配置

2)Bean的别名配置 

3)Bean的范围配置 【singleton(单例模式)/prototype(多对象模式)】

 

 4)Bean的延迟加载

 

 5)Bean的初始化和销毁方法配置

方法一:init-method/destory-method

方法二: 实现InitializingBean

 6)Bean的实例化配置【创建Bean方式】

 方法一:构造方法实例化:<constructor-arg>

 当没有无参构造方法而使用有参构造方法时候,要在相关的配置文件中使用<constructor-arg>,进行配置,name对应参数名,value对应相关的值

方法二:工厂方法实例化

⚫ 静态工厂方法实例化Bean

⚫ 实例工厂方法实例化Bean

⚫ 实现FactoryBean规范延迟实例化Bean

 

 7)Bean的依赖注入配置

 

注入 List 集合 

 注入 Set 集合

 注入 Map 集合

 注入 Properties 键值对

扩展:自动装配方式

 8)Spring的其他配置标签

 

 <bean>标签

 

指定其他环境的情况下,默认环境都起作用

<import>标签  

 <alisas>标签:起别名

 

 Spring的自定义标签

先在pom导入坐标

 

- Spring 的get方法

        Object userDao1 =applicationContext.getBean("userDao1");UserDao userDao11 = applicationContext.getBean("userDao1", UserDao.class);UserDao bean = applicationContext.getBean(UserDao.class);

- Spring 配置非自定义Bean

 1)配置 Druid 数据源交由Spring管理

    <!-- mysql驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version></dependency><!-- druid数据源 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.23</version></dependency>

    <!--配置 DruidDataSource数据源--><bean class="com.alibaba.druid.pool.DruidDataSource"><!--配置必要属性--><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc://localhost:3306/mybatis"/><property name="username" value="root"/><property name="password" value="root"/></bean>

2)配置Connection交由Spring管理【静态工厂方法】

3)配置日期对象交由Spring管理 【实例化工厂方法】

 4)配置MyBatis的SqlSessionFactory交由Spring管理【多种配置方法统一】

mybatis-conifg.xml 

 

- Bean 实例化的基本流程

 

 

 

 

- Spring的后处理器

beanDefinitionMap->bean工厂后处理器->循环map(实例化->bean后处理器->填充到单例池) 

 BeanFactoryPostProcessor

 

 BeanDefinition 

 BeanDefinitionRegistryPostProcessor[BeanFactoryPostProcessor的子接口]

 小总结:

 自定义注解【注解的底层实现】

 

 

 BeanPostProcessor

 

 

 对Bean方法进行执行时间日志增强

 

 

public class TimeLogBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {//使用动态代理对目标Bean进行增强,返回proxy对象,进而存储到单例池singletonObjects中Object beanProxy = Proxy.newProxyInstance(bean.getClass().getClassLoader(),bean.getClass().getInterfaces(),(proxy, method, args) -> {//1、输出开始时间System.out.println("方法:" + method.getName() + "-开始时间:" + new Date());//2、执行目标方法Object result = method.invoke(bean, args);//3、输出结束时间System.out.println("方法:" + method.getName() + "-结束时间:" + new Date());return result;});return beanProxy;}
}

- Spring Bean的生命周期

 Bean初始化阶段

 Bean实例属性填充

注入双向对象引用

 

 

 三级缓存(解决注入双向对象引用)

 P54底层源码(欠)

常用的Aware接口

- Spring IoC 整体流程总结

 

 

 

硬核讲解:

55-Spring IoC容器实例化Bean整体流程图_哔哩哔哩_bilibili

- Spring xml方式整合MyBatis

Spring整合MyBatis --纯手写Mybatis整合

public interface UserMapper {List<User> findAll();}

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.UserMapper"><select id="findAll" resultType="com.itheima.pojo.User">select * from tb_user</select>
</mapper>
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><package name="com.itheima.mapper"></package></mappers></configuration>
MyBatisTest
public class MyBatisTest {public static void main(String[] args) throws Exception {InputStream in = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();SqlSessionFactory sqlSessionFactory = builder.build(in);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);List<User> all = mapper.findAll();for (User user : all) {System.out.println(user);}}}

 Spring整合MyBatis 

        <dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.13.RELEASE</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.5</version></dependency>

    <!--配置数据源信息--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driver}"></property><property name="url" value="${jdbc.url}"></property><property name="username" value="${jdbc.username}"></property><property name="password" value="${jdbc.password}"></property></bean><!--配置SqlSessionFactoryBean,作用将SqlSessionFactory存储到spring容器--><bean class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"></property></bean><!--MapperScannerConfigurer,作用扫描指定的包,产生Mapper对象存储到Spring容器--><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.itheima.mapper"></property></bean>

 

Spring整合MyBatis的原理剖析 

SqlSessionFactoryBean 

 执行完SqlSessionFactoryBean后,里面调用了getObject然后产生SqlSessionFactory。

 

 

MapperScannerConfigurer

60-Spring整合第三方框架-MyBatis整合Spring-MapperScannerConfigurer_哔哩哔哩_bilibili

 

 Spring xml方式整和第三方框架【自定义命名空间】

 使用外部配置文件

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root

    <!--加载properties文件--><context:property-placeholder location="classpath:jdbc.properties"/><!--配置数据源信息--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driver}"></property><property name="url" value="${jdbc.url}"></property><property name="username" value="${jdbc.username}"></property><property name="password" value="${jdbc.password}"></property></bean>
硬核讲解

62-Spring整合第三方框架-自定义命名空间解析原理_哔哩哔哩_bilibili

 

 

 

 

 

 基本流程

 

P-65-66 

◆ 基于注解的Spring应用

- Bean基本注解开发

 

 在@Component后面不加value值,默认id是该类名首字母小写

 

- Bean依赖注入注解开发

@Value 

 

 

 @Autowired【根据类型进行注入】

根据类型进行注入,如果同一个类型的Bean有多个,尝试根据名字进行二次匹配,匹配变不成功的则匹配失败

 

 

 @Qualifier

结合@Autowired一起使用,作用是根据名称注入相应的Bean

在非自定义属性上要@Autowird+@Qualifier 

在自定义属性中添加参数名可以单独使用@Qualifier

 

 @Resource

不指定名称参数时,根据类型注入【@Autowired】,指定名称就根据名称注入【@Autowired+@Qualifier】

- 非自定义Bean注解开发【@Bean】

注意点:

 

 

 

@Component
public class OtherBean {@Bean("dataSource")public DataSource dataSource(@Value("${jdbc.driver}") String driverClassName,@Qualifier("userDao2") UserDao userDao,UserService userService){/*System.out.println(driverClassName);System.out.println(userDao);System.out.println(userService);*/DruidDataSource dataSource = new DruidDataSource();//设置4个基本参数 ...return dataSource;}}

 

- Bean配置类的注解开发【替代整个配置文件】

 @Configuration

 @ComponentScan

 @PropertySource

 @Import

@Configuration  //标注当前类是一个配置类(替代配置文件)+@Component-->替代了<bean>//<context:component-scan base-package="com.itheima"/>
@ComponentScan("com.itheima")//相当于包扫描//<context:property-placeholder location="classpath:jdbc.properties"/>
@PropertySource("classpath:jdbc.properties")//属性资源//<import resource=""></import>
@Import(OtherBean.class)

- Spring 配置其他注解

@Primary

@Profile 【切换环境】

没有指定环境,在任何情况下都可以使用

- Spring注解的解析原理

 

 

 

 

- Spring注解方式整合第三方框架

使用xml

 使用注解

 

 @import

@Import导入实现了ImportSelector接口的类

 @Import导入实现ImportBeanDefinitionRegistrar接口

相关文章:

Spring IOC

◆ 传统Javaweb开发的困惑 ◆ IoC、DI和AOP思想提出 ◆ Spring框架的诞生 Spring | Home IOC控制反转&#xff1a;BeanFactory 快速入门 package com.xiaolin.service.Impl;import com.xiaolin.dao.UserDao; import com.xiaolin.service.UserService;public class UserServic…...

华为OD机试真题【上班之路】

1、题目描述 【上班之路】 Jungle 生活在美丽的蓝鲸城&#xff0c;大马路都是方方正正&#xff0c;但是每天马路的封闭情况都不一样。 地图由以下元素组成&#xff1a; 1&#xff09;”.” — 空地&#xff0c;可以达到; 2&#xff09;”*” — 路障&#xff0c;不可达到; 3&a…...

【linux源码学习】【实验篇】使用bochs运行linux0.11系统(搭建一个自己的工作站)

目录 背景资源获取bochs环境搭建windowsbochs环境搭建linux声明 背景 最近看赵炯老师的《linux内核完全注释》&#xff0c;然后在最后一个习题里面看到使用bochs跑一下0.11的内核代码&#xff0c;本来觉得很难&#xff0c;但是如果做过一遍就会发现其实很简单&#xff0c;这个…...

java+springboot+mysql个人日记管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的个人日记管理系统&#xff0c;系统包含超级管理员、管理员、用户角色&#xff0c;功能如下&#xff1a; 超级管理员&#xff1a;管理员管理&#xff1b;用户管理&#xff1b;反馈管理&#xff1b;系统公告&#xff1b;个人…...

旋转图像 LeetCode热题100

题目 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 思路 利用矩阵性质&#xff0c;先反转矩阵的每一列元素&#xff0c;再把…...

Vue3 element-plus表单嵌套表格实现动态表单验证

Vue3结合element-plus表单项可以动态添加/删除 部分效果图如下&#xff1a; 另表格有添加和删除按钮&#xff0c;点击提交进行表单验证。 首先data格式必须是对象包裹数组 import { ref, reactive } from vue; import { FormInstance } from element-plus const froms re…...

VSCode插件Todo Tree的使用

在VSCode中安装插件Todo Tree。按下快捷键ctrlshiftP&#xff0c;输入setting.jspn&#xff0c;选择相应的配置范围&#xff0c;我们选择的是用户配置 Open User Settings(JSON)&#xff0c;将以下代码插入其中。 //todo-tree 标签配置从这里开始 标签兼容大小写字母(很好的功…...

无人驾驶实战-第五课(动态环境感知与3D检测算法)

激光雷达的分类&#xff1a; 机械式Lidar&#xff1a;TOF、N个独立激光单元、旋转产生360度视场 MEMS式Lidar&#xff1a;不旋转 激光雷达的输出是点云&#xff0c;点云数据特点&#xff1a; 简单&#xff1a;x y z i &#xff08;i为信号强度&#xff09; 稀疏&#xff1a;7%&…...

Tomcat 的内存配置

修改 Tomcat 的内存配置&#xff0c;你需要调整 Tomcat 的 Java 虚拟机&#xff08;JVM&#xff09;参数。具体来说&#xff0c;你需要修改 catalina.sh&#xff08;Linux/macOS&#xff09;或 catalina.bat&#xff08;Windows&#xff09;脚本中的 JAVA_OPTS 变量。以下是一般…...

pycharm出现python test运行报错(pytest模式)

pycharm出现python test运行报错 一、python test 执行代码报错二、删除运行配置三、修改pycharm默认配置为 unittests四、成功&#xff01; 一、python test 执行代码报错 二、删除运行配置 三、修改pycharm默认配置为 unittests 四、成功&#xff01;...

JavaScript篇 this指向

文章目录 1.this 关键字2.this实质3.使用场合3.1.全局环境3.2.构造函数3.3.对象的方法 4. 使用注意4.1.避免多层 this4.2.避免数组处理方法中的 this4.3.避免回调函数中的 this 5.绑定this5.1.Function.prototype.call()5.2.Function.prototype.apply()5.3.Function.prototype.…...

操作系统复习总结1

操作系统复习总结&#xff0c;仅供笔者复习使用&#xff0c;参考教材&#xff1a; 《操作系统原理》 - 何静媛编著. 西安电子科技大学出版社《操作系统考研复习指导》2024年 - 王道论坛组编. 电子工业出版社 本文主要内容为&#xff1a;计算机系统概述&#xff1b; 计算机系…...

Matlab中图的最短路径

前言&#xff1a; 图的基本概念&#xff1a; 若想简单绘制图可以利用此网站&#xff1a; 左上角Undirected/Directed是无向图/有向图 左边 0-index &#xff0c;1-index为0下标&#xff0c;1下标。 Node Count为节点个数 Graph Data&#xff1a;最初尾节点的名称&#xff…...

没有jodatime,rust里怎么将字符串转为日期呢?

关注我&#xff0c;学习Rust不迷路&#xff01;&#xff01; 在 Rust 中&#xff0c;有多种方法可以在时间和字符串之间进行转换。以下是五种常见的方式&#xff1a; 1. 使用 chrono 库进行转换&#xff1a; use chrono::{NaiveDateTime, DateTime, Utc, TimeZone};fn main(…...

【Markdown入门及使用】

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…...

大数据面试题:HBase的读写缓存

面试题来源&#xff1a; 《大数据面试题 V4.0》 大数据面试题V3.0&#xff0c;523道题&#xff0c;679页&#xff0c;46w字 参考答案&#xff1a; HBase上RegionServer的cache主要分为两个部分&#xff1a;MemStore & BlockCache。 MemStore是写缓存&#xff0c;Block…...

springboot基于vue的高校迎新系统的设计与实现8jf9e

随着时代的发展&#xff0c;人们的生活方式得到巨大的改变&#xff0c;从而慢慢地产生了大量高校迎新信息&#xff0c;高校迎新信息需要一个现代化的管理系统&#xff0c;进行高校迎新信息的管理。 高校迎新系统的开发就是为了解决高校迎新管理的问题&#xff0c;系统开发是基于…...

JVM入门到精通

一、JVM概念 1.1、什么是JVM Java Virtual Machine&#xff1a;Java虚拟机&#xff0c;用来保证Java语言跨平台 Java虚拟机可以看做是一台抽象的计算机&#xff0c;如同真实的计算机那样&#xff0c;它有自己的指令集以及各种运行时内存区域 Java虚拟机与Java语言并没有必然…...

Hive执行引擎的区别

执行引擎 Tez、Spark 和 MapReduce 都是用于在大数据处理中执行任务的框架或引擎&#xff0c;它们在性能、优化、适用场景等方面有一些区别。 MapReduce&#xff1a; MapReduce 是 Hadoop 最早引入的批处理计算模型&#xff0c;它将任务分成 Map 和 Reduce 两个阶段&#xff0c…...

分布式 - 服务器Nginx:常见问题总结(二)

文章目录 01. Nginx 虚拟主机怎么配置?02. Nginx location 指令的作用&#xff1f;03. Nginx location 指令如何与其他指令一起使用&#xff1f;04. Nginx root 命令的作用&#xff1f;05. Nginx if 模块的作用&#xff1f;06. Nginx include 指令的作用&#xff1f;07. Nginx…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...