《如何用 Function 实现动态配置驱动的处理器注册机制?》
大家好呀!👋 今天我们来聊聊一个超实用的技术话题 - 如何用Java的Function接口实现动态配置驱动的处理器注册机制。听起来很高大上?别担心,我会用最简单的方式讲清楚!😊
一、为什么要用Function实现处理器注册?🤔
想象一下你开了一家快递站📦,每天要处理各种快递公司的包裹:
- 顺丰快递
- 京东快递
- 中通快递
- 圆通快递
- …
如果每来一家新快递公司,你就要修改代码重新部署,那多麻烦啊!😫
这时候,动态配置驱动的处理器注册机制就派上用场啦!它允许你:
- 不修改代码就能添加新处理器
- 通过配置文件管理所有处理器
- 运行时动态加载新处理器
二、Function接口简介 🧩
Function是Java 8引入的一个函数式接口,超级简单:
@FunctionalInterface
public interface Function {R apply(T t);
}
它就像一个小机器:
- 你输入一个东西(T)
- 它处理一下
- 然后输出结果®
三、实现步骤详解 🔍
1. 定义处理器接口
我们先定义一个快递处理接口:
// 快递处理器函数式接口
@FunctionalInterface
public interface ExpressHandler extends Function {// 这里继承了Function,输入ExpressOrder,输出ExpressResult
}
2. 创建具体处理器
让我们创建几个具体的快递处理器:
// 顺丰处理器
public class SFExpressHandler implements ExpressHandler {@Overridepublic ExpressResult apply(ExpressOrder order) {System.out.println("处理顺丰快递订单: " + order.getOrderId());// 具体的处理逻辑...return new ExpressResult("SF", true);}
}// 京东处理器
public class JDExpressHandler implements ExpressHandler {@Overridepublic ExpressResult apply(ExpressOrder order) {System.out.println("处理京东快递订单: " + order.getOrderId());// 具体的处理逻辑...return new ExpressResult("JD", true);}
}
3. 创建处理器注册中心 🏢
这是最核心的部分!我们创建一个注册中心来管理所有处理器:
public class ExpressHandlerRegistry {// 存储所有处理器,key是快递公司代码,value是对应的处理器private final Map handlers = new ConcurrentHashMap<>();// 注册处理器public void registerHandler(String expressCode, ExpressHandler handler) {handlers.put(expressCode, handler);}// 获取处理器public Optional getHandler(String expressCode) {return Optional.ofNullable(handlers.get(expressCode));}// 处理订单public ExpressResult handleOrder(ExpressOrder order) {return getHandler(order.getExpressCode()).map(handler -> handler.apply(order)).orElseThrow(() -> new IllegalArgumentException("不支持的快递公司: " + order.getExpressCode()));}
}
4. 配置驱动实现 🎛️
现在我们来实现动态配置!假设我们有一个配置文件express-handlers.json
:
{"SF": "com.example.handler.SFExpressHandler","JD": "com.example.handler.JDExpressHandler","ZT": "com.example.handler.ZTExpressHandler"
}
然后创建一个配置加载器:
public class HandlerConfigLoader {public static void loadHandlersFromConfig(ExpressHandlerRegistry registry, String configPath) {try {String json = Files.readString(Paths.get(configPath));JsonObject config = JsonParser.parseString(json).getAsJsonObject();for (Map.Entry entry : config.entrySet()) {String expressCode = entry.getKey();String className = entry.getValue().getAsString();// 使用反射创建处理器实例Class clazz = Class.forName(className);ExpressHandler handler = (ExpressHandler) clazz.getDeclaredConstructor().newInstance();// 注册处理器registry.registerHandler(expressCode, handler);}} catch (Exception e) {throw new RuntimeException("加载处理器配置失败", e);}}
}
5. 使用示例 💻
让我们看看怎么使用这个系统:
public class Main {public static void main(String[] args) {// 1. 创建注册中心ExpressHandlerRegistry registry = new ExpressHandlerRegistry();// 2. 从配置文件加载处理器HandlerConfigLoader.loadHandlersFromConfig(registry, "config/express-handlers.json");// 3. 创建订单ExpressOrder order1 = new ExpressOrder("SF", "SF123456789");ExpressOrder order2 = new ExpressOrder("JD", "JD987654321");// 4. 处理订单ExpressResult result1 = registry.handleOrder(order1);ExpressResult result2 = registry.handleOrder(order2);System.out.println("顺丰订单处理结果: " + result1);System.out.println("京东订单处理结果: " + result2);}
}
四、高级进阶技巧 🚀
1. 动态添加新处理器
想要不重启应用就添加新处理器?可以这样:
public void watchConfigChanges(String configPath) {WatchService watchService = FileSystems.getDefault().newWatchService();Path path = Paths.get(configPath).getParent();path.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY);new Thread(() -> {while (true) {WatchKey key = watchService.take();for (WatchEvent event : key.pollEvents()) {if (event.context().toString().equals("express-handlers.json")) {// 配置文件修改了,重新加载loadHandlersFromConfig(registry, configPath);System.out.println("处理器配置已更新!");}}key.reset();}}).start();
}
2. 使用Spring集成 🌱
如果你用Spring,可以更简单:
@Configuration
public class HandlerConfig {@Beanpublic ExpressHandlerRegistry expressHandlerRegistry() throws Exception {ExpressHandlerRegistry registry = new ExpressHandlerRegistry();Resource resource = new ClassPathResource("express-handlers.json");HandlerConfigLoader.loadHandlersFromConfig(registry, resource.getFile().getPath());return registry;}
}// 使用时直接注入
@Autowired
private ExpressHandlerRegistry expressHandlerRegistry;
3. 组合处理器 🔗
Function有个好用的方法andThen
,可以组合处理器:
// 创建一个日志记录处理器
ExpressHandler loggingHandler = order -> {System.out.println("开始处理订单: " + order.getOrderId());return null; // 只是记录,不改变结果
};// 组合处理器
ExpressHandler combinedHandler = loggingHandler.andThen(registry.getHandler("SF").get());// 使用组合处理器
ExpressResult result = combinedHandler.apply(order);
五、实际应用场景 🏭
这种模式在很多地方都超有用:
- 支付系统:不同支付渠道(支付宝、微信、银联)处理
- 文件解析:不同文件格式(CSV、Excel、JSON)解析
- 消息处理:不同消息类型(短信、邮件、推送)处理
- 游戏开发:不同游戏事件处理
六、优缺点分析 ⚖️
优点:
- ✅ 灵活扩展:新增处理器不用改代码
- ✅ 配置化:所有处理器在配置文件中管理
- ✅ 解耦:处理器之间相互独立
- ✅ 可测试:每个处理器可以单独测试
缺点:
- ❌ 反射开销:使用反射创建实例有一定性能损耗
- ❌ 配置错误:配置错误要到运行时才能发现
- ❌ 类型安全:需要自己保证类型匹配
七、最佳实践 🏆
- 添加默认处理器:为未知类型提供默认处理
- 缓存处理器实例:避免重复创建
- 配置校验:启动时检查配置有效性
- 版本控制:对配置文件进行版本管理
- 监控报警:监控处理器执行情况
八、完整代码示例 🎮
由于篇幅限制,这里给出关键部分的完整实现:
// 订单类
public class ExpressOrder {private String expressCode;private String orderId;// 构造方法、getter、setter...
}// 结果类
public class ExpressResult {private String expressCode;private boolean success;// 构造方法、getter、setter...
}// 处理器注册中心(增强版)
public class ExpressHandlerRegistry {private final Map handlers = new ConcurrentHashMap<>();private ExpressHandler defaultHandler = order -> new ExpressResult(order.getExpressCode(), false);public void registerHandler(String expressCode, ExpressHandler handler) {handlers.put(expressCode, handler);}public void setDefaultHandler(ExpressHandler handler) {this.defaultHandler = handler;}public ExpressResult handleOrder(ExpressOrder order) {return handlers.getOrDefault(order.getExpressCode(), defaultHandler).apply(order);}// 批量注册public void registerAll(Map handlerMap) {handlers.putAll(handlerMap);}
}
九、总结 📝
今天我们学习了:
- Function接口的基本用法
- 如何实现动态处理器注册机制
- 通过配置文件驱动处理器加载
- 实际应用中的各种技巧
记住这个模式的核心理念:把变与不变分离!将可能变化的处理器实现与不变的处理器调度逻辑分开,让你的系统更灵活、更易于维护。✨
下次当你遇到需要处理多种类似但不同的业务场景时,不妨试试这个模式!💪
如果觉得有帮助,别忘了点赞收藏哦!❤️ 有什么问题欢迎在评论区讨论~ 🎉
相关文章:
《如何用 Function 实现动态配置驱动的处理器注册机制?》
大家好呀!👋 今天我们来聊聊一个超实用的技术话题 - 如何用Java的Function接口实现动态配置驱动的处理器注册机制。听起来很高大上?别担心,我会用最简单的方式讲清楚!😊 一、为什么要用Function实现处理器…...
PyTorch:学习 CIFAR-10 分类
🔍 开始你的图像分类之旅:一步一步学习 CIFAR-10 分类 图像分类是计算机视觉中最基础的任务之一,如果你是初学者,那么以 CIFAR-10 为训练场是一个不错的选择。本文一步一步带你从零开始,学习如何用深度学习模型实现图…...
SpringBoot整合Thymeleaf模板:构建现代化Web视图层的完整指南
在Java Web开发领域,Thymeleaf作为一款自然模板引擎,凭借其优雅的语法和与Spring生态的无缝集成,已成为替代传统JSP的首选方案。本文将从技术整合、核心原理到生产实践,深度解析SpringBoot与Thymeleaf的协同工作方式。 一、Thymel…...
学习笔记十五——rust柯里化,看不懂 `fn add(x) -> impl Fn(y)` 的同学点进来!
🧠 Rust 柯里化从零讲透:看不懂 fn add(x) -> impl Fn(y) 的同学点进来! 🍔 一、什么是柯里化?先用一个超好懂的生活比喻 假设你在点一个汉堡: 你说:我要点一个鸡腿汉堡! 店员…...
软件安装包-yum
yum:软件管理的得力助手 yum是一个软件下载安装管理的一个客户端,例如:小米应用商城、华为应用商城... Linux中软件包可能有依赖关系——yum会帮我们解决依赖关系的问题! 1、软件包是什么? 在Linux下安装软件, 一个通…...
C++面试
C面试 c面试100题 1、封装多态继承 2、数据集合 3、 4、便于外部文件访问 5、只能通过对象访问 6、通过类名 7、构造函数、析构函数、拷贝构造函数、拷贝复制函数 8、将一个对象复制给新建的对象 9、没有返回值 10、类的对象中有指针,防止多个指针指向同…...
Java SpringBoot设置自定义web的图片本地路径
一,设置配置文件:application.properties my.config.image-pathD:\\Download\\images二,新增配置类:MyImagesConfig import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springfr…...
Python HTTP库——requests
文章目录 简介安装基本概念RESTfulAPIOAuth2.0Cookie和Session 初试GET请求POST请求PUT请求DELETE请求HEAD请求OPTIONS请求传递查询参数响应内容自定义响应头传递表单参数传递文件响应状态码响应头Cookies重定向和历史记录超时错误和异常Session对象请求和响应对象预处理请求SS…...
用idea配置springboot+mybatis连接postersql数据库
从socket开始,我们就要开始部署前后端的交互了,所以今天带来一份热度比较高的框架springboot,并教大家如何连接数据库。 框架 先给大家看一下目录结构,因为有些需要调用文件路径: 创建项目: 新版本可以…...
【补充篇】Davinci工具要求的dbc格式
1 简介 DBC文件是一种用于描述CAN(Controller Area Network,控制器局域网络)通信协议中报文和信号的格式化文件,其全称为“Database CAN”。DBC文件的核心作用是定义和解析CAN网络中的通信数据,包括节点、报文、信号及其属性等信息。 对于不同角色的工程师,DBC文件有着…...
IT资产管理(一)之GLPI安装及部署
一、GLPI 介绍 GLPI:Gestionnaire Libre de Parc Informatique 是一个免费的资产和 IT 管理软件包,提供 ITIL 服务台功能、许可证跟踪和软件审计。 GLPI 的主要功能: 服务资产和配置管理 (SACM):管理您的 IT 资产和配置,跟踪计算机、外围设备、网络打印机及其相关组件…...
RPCRT4!OSF_CCALL::ActivateCall函数分析之RPCRT4!OSF_CCALL结构中的Bindings--RPC源代码分析
第一部分: 1: kd> t RPCRT4!OSF_CCALL::ActivateCall: 001b:77bf5789 55 push ebp 1: kd> kc # 00 RPCRT4!OSF_CCALL::ActivateCall 01 RPCRT4!OSF_CASSOCIATION::AllocateCCall 02 RPCRT4!OSF_BINDING_HANDLE::AllocateCCall 03 RPCRT4!OS…...
docker登录AWS ECR拉取镜像
1、配置AWS 登录key [rootip-172-31-13-6 ~]# aws configure AWS Access Key ID [None]: XXXXXXXXXXX AWS Secret Access Key [None]: %%YYYDSRGTHFGFSGRTHTHE$RHTSG Default region name [None]: ap-southeast-1 Default output format [None]: json2、登录AWS ECR镜像仓库 …...
IntelliJ IDEA download JDK
IntelliJ IDEA download JDK 自动下载各个版本JDK,步骤 File - Project Structure (快捷键 Ctrl Shift Alt S) 如果下载失败,换个下载站点吧。一般选择Oracle版本,因为java被Oracle收购了 好了。 花里胡哨&#…...
MQTT协议与HTTP协议的对比分析
以下是MQTT协议与HTTP协议的对比分析,从协议特性到应用场景的系统性对比: 一、协议层级与设计目标对比 维度MQTTHTTP协议层级应用层协议(基于TCP/IP)应用层协议(基于TCP/IP)核心设计目标机器间轻量级消息通…...
jenkins凭据管理(配置github密钥)
1.凭据管理 添加两种类型的凭据,Username with password和Secret text(填的token) Username with password是github登录的用户名和密码,Secret text填的github生成的token,权限的限制更细,安全性更高一些 Dashboard -> Manag…...
B端小程序如何突破常规,成为企业获客新利器?
数据驱动的用户旅程优化 在当今竞争激烈的市场环境中,了解并优化用户的交互路径对于吸引和保留客户至关重要。B端小程序可以通过收集用户行为数据来分析用户偏好和使用习惯。例如,应用热图分析工具可以直观展示用户点击最频繁的区域,帮助企业…...
25.4.17学习总结
关于bcrypt算法 BCrypt 的主要特点和优点: 加盐 (Salting): BCrypt 会自动为每个密码生成一个随机的盐值 (salt) 并将其与密码组合在一起,然后再进行哈希。 盐值是随机数据,用于防止彩虹表攻击。 这意味着即使两个用户使用相同的密码&#x…...
java 设计模式 策略模式
简介 策略模式(Strategy Pattern)是一种行为设计模式,旨在定义一系列算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户端。换句话说,策略模式通过将不同的算法…...
游戏盾和高防ip有什么区别
游戏盾和高防IP都是针对网络攻击的防护方案,但核心目标、技术侧重点和应用场景存在显著差异。以下是两者的详细对比分析: 一、核心定位与目标 维度高防IP游戏盾核心目标抵御大流量网络攻击(…...
关于 雷达(Radar) 的详细解析,涵盖其定义、工作原理、分类、关键技术、应用场景、挑战及未来趋势,结合实例帮助理解其核心概念
以下是关于 雷达(Radar) 的详细解析,涵盖其定义、工作原理、分类、关键技术、应用场景、挑战及未来趋势,结合实例帮助理解其核心概念: 一、雷达的定义与核心功能 1. 定义 雷达(Radar,Radio D…...
机器学习 Day11 决策树
1.决策树简介 原理:思想源于程序设计的 if - else 条件分支结构 ,是一种树形结构。内部节点表示属性判断,分支是判断结果输出,叶节点是分类结果 。案例:以母亲给女儿介绍男朋友为例。女儿依次询问年龄(≤3…...
【HFP】深入解析蓝牙 HFP 协议中呼叫转移、呼叫建立及保持呼叫状态的机制
目录 一、核心指令概述 1.1 ATCMER:呼叫状态更新的 “总开关” 1.2 ATBIA:指示器的 “精准控制器” 1.3 指令对比 1.4 指令关系图示 二、CIEV 结果码:状态传递的 “信使” 2.1 工作机制 2.2 三类核心指示器 三、状态转移流程详解 3…...
音频识别优化(FFT)
整合多频段检测、动态阈值调整和持续时长验证的完整代码实现,包含详细注释: #include "esp_dsp.h" #include "driver/i2s.h" #include "esp_log.h" #include "math.h" static const char* TAG "ADV_FRE…...
【Redis】Redis基本命令(1)
KEYS 返回所有满足样式(pattern)的key。 KEY * 返回所有key,不简易使用 性能问题:当 Redis 存储百万级键时,会消耗大量 CPU 和内存资源,Redis 是单线程模型,KEYS * 执行期间会阻塞其他所有命令…...
IDEA2024 pom.xml依赖文件包报红解决
异常: 原因: 本地的Maven Repository库中不存在对应版本的dependency依赖,所以导致报红。 解决: 方法1:找到对应项目,右键Sync Project 就可以了 方法2:修改setting中maven的自动更新…...
Qt 信号与槽复习
Qt 信号与槽复习 Qt 信号与槽(Signals and Slots)机制是 Qt 框架的核心特性之一,用于实现对象之间的通信。它提供了一种松耦合的方式,使得组件可以独立开发和复用,广泛应用于 GUI 编程、事件处理和跨模块交互。本文将…...
RestControllerAdvice 和 ControllerAdvice 两个注解的区别与联系
它们都用于实现全局的通用处理逻辑,主要应用在以下三个方面: 全局异常处理: 使用 ExceptionHandler 注解的方法。全局数据绑定: 使用 InitBinder 注解的方法。全局数据预处理: 使用 ModelAttribute 注解的方法。 联系: 核心功能相同: 两者都提供了上述…...
最快打包WPF 应用程序
在 Visual Studio 中右键项目选择“发布”,目标选“文件夹”,模式选“自包含”,生成含 .exe 的文件夹,压缩后可直接发给别人或解压运行,无需安装任何东西。 最简单直接的新手做法: 用 Visual Studio 的“…...
Java NIO Java 虚拟线程(微线程)与 Go 协程的运行原理不同 为何Go 能在低配机器上承接10万 Websocket 协议连接
什么是Java NIO? Java NIO(New Input/Output) 是Java 1.4(2002年)引入的一种非阻塞、面向缓冲区的输入输出框架,旨在提升Java在高性能和高并发场景下的I/O处理能力。它相比传统的 Java IO(java…...
C# 对列表中的元素的多个属性进行排序
目录 前言一、OrderBy、OrderByDescending、ThenBy、ThenByDescending二、Sort 前言 在开发过程中,我们经常需要 根据列表中的元素的某个属性进行排序,下面我们将简单介绍常用的排序函数。 例如此处有一个类,拥有的元素为编号和值 public …...
OpenCV颜色变换cvtColor
OpenCV计算机视觉开发实践:基于Qt C - 商品搜索 - 京东 颜色变换是imgproc模块中一个常用的功能。我们生活中看到的大多数彩色图片都是RGB类型的,但是在进行图像处理时需要用到灰度图、二值图、HSV(六角锥体模型,这个模型中颜色的…...
java IO/NIO/AIO
(✪▽✪)曼波~~~~!让曼波用最可爱的赛马娘方式给你讲解吧!(⁄ ⁄•⁄ω⁄•⁄ ⁄) 🎠曼波思维导图大冲刺(先看框架再看细节哦): 📚 解释 Java 中 IO、NIO、AIO 的区别和适用场景: …...
如何深入理解引用监视器,安全标识以及访问控制模型与资产安全之间的关系
一、核心概念总结 安全标识(策略决策的 “信息载体) 是主体(如用户、进程)和客体(如文件、数据库、设备)的安全属性,用于标记其安全等级、权限、访问能力或受保护级别,即用于标识其安全等级、权限范围或约束…...
宜搭与金蝶互通——连接器建立
一、 进入连接器工厂 图1 连接器入口 二、 新建连接器 图2 新建连接器第一步 1、 连接器显示名,如图2中①所示; 2、 图2中②域名,是金蝶系统API接口里面的“完整服务地址”com之前的信息,不含“https”,如图3中①所示; 3、 Base Url通常为“/”,如图2…...
中间件--ClickHouse-7--冷热数据分离,解决Mysql海量数据瓶颈
在web应用中,当数据量非常大时,即使MySQL的存储能够满足,但性能一般也会比较差。此时,可以考虑使用ClickHouse存储历史数据,在Mysql存储最近热点数据的方式,来优化和提升查询性能。ClickHouse的设计初衷就是…...
1.1 设置电脑开机自动用户登录exe开机自动启动
本文介绍两个事情: 1.Windows如何开机自动登录系统(不用输密码) 2. 应用程序(.exe)如何开机自动启动 详细解释如下: 一、Windows如何开机自动登录系统(不用输密码) 设备上的工控机,如果开机后都需要操作人员输入密码&…...
vscode stm32 variable uint32_t is not a type name 问题修复
问题 在使用vscodekeil开发stm32程序时,发现有时候vscode的自动补全功能失效,且problem窗口一直在报错。variable “uint32_t” is not a type name uint32_t 定义位置 uint32_t 实际是在D:/Keil_v5/ARM/ARMCC/include/stdint.h中定义的。将D:/Keil_v5…...
动态规划与记忆化搜索的区别与联系
记忆化搜索(Memoization)和动态规划(Dynamic Programming, DP)都是解决重叠子问题的高效算法技术,但它们有着不同的实现方式和特点。 1. 基本概念 记忆化搜索(自顶向下) 本质:带有…...
html+js+clickhouse环境搭建
实验背景: 我目前有一台服务器A,和一台主机B,两台设备属于同一局域网,相互之间可以通讯。服务器A中部署着clickhouse,我在主机B中想直接通过javascript代码访问服务器中的clickhouse数据库并获取数据。 ClickHouse 服务…...
生命护航行动再启航!
温州好人陈飞携防溺水课堂,为乡村少年宫筑起安全防线 图文作者:华夏之音/李望 随着夏日热浪的滚滚而来,楠溪江畔的安全警钟再次响起。在这片如诗如画的土地上,一场旨在保护青少年生命安全的防溺水课堂活动拉开了…...
Android Compose Activity 页面跳转动画详解
下面我将全面详细地介绍在 Compose 中实现 Activity 跳转动画的各种方法,包括基础实现、高级技巧和最佳实践。 一、基础 Activity 过渡动画 1. overridePendingTransition 传统方式 这是最基础且兼容性最好的方法,适用于所有 Android 版本。 实现步骤…...
Android启动初始化init.rc详解
1. Android启动与init.rc简介 1.1 Android启动过程 一张图简单阐述一下 (网络图片,侵删) 1.2 init.rc 简介 Linux的重要特征之一就是一切都是以文件的形式存在的,例如,一个设备通常与一个或多个设备文件对应。这些…...
Linux驱动开发-①regmap②IIO子系统
Linux驱动开发-IIO驱动 一,regmap二,IIO子系统2.1初始化相关工作2.2 通道2.3 读实现 over 一,regmap 对于spi和i2c,读写寄存器的框架不同,但设备本质一样,因此就有了regmap模型来对其进行简化,提供统一的接…...
HTML5好看的水果蔬菜在线商城网站源码系列模板5
文章目录 1.设计来源1.1 主界面1.2 关于我们1.3 商品服务1.4 果蔬展示1.5 联系我们1.6 商品具体信息1.7 登录注册 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 作者:xcLeigh 文章地址&#…...
L2-033 简单计算器满分笔记
本题要求你为初学数据结构的小伙伴设计一款简单的利用堆栈执行的计算器。如上图所示,计算器由两个堆栈组成,一个堆栈 S1 存放数字,另一个堆栈 S2 存放运算符。计算器的最下方有一个等号键,每次按下这个键,计算器就…...
其他网页正常进入,但是CSDN进入之后排版混乱
显示不正常,排版混乱 解决方法: ①打开网络设置 ②更改适配器 ③所连接的网络 --右键 属性 然后就可以正常访问了。...
BFC详解
1.定义: FC的全称为Formatting Conttext,元素在标准流里面 块级元素的布局属于Block Formatting Context(BFC)——即block level box都是BFC中布局 行内级元素的布局属于Inline Formatting Context (IFC) 2.那么在哪些情况下会创建BFC? 根元素…...
(H3C)vlan配置实验
1.实验拓扑 2.实验配置 [S1]dis cu #version 7.1.070, Alpha 7170 #sysname S1 # vlan 10 # vlan 20 # interface GigabitEthernet1/0/1port link-mode bridgeport link-type trunkport trunk permit vlan 1 10 20combo enable fiber # interface GigabitEthernet1/0/2port li…...
idea mvn执行打包命令后控制台乱码
首先在idea中查看maven的编码方式 执行mvn -v命令 查看编码语言是GBK C:\Users\13488>mvn -v Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f) Maven home: D:\maven\apache-maven-3.6.3\bin\.. Java version: 1.8.0_202, vendor: Oracle Corporation, runt…...