SpringBoot动态配置Nacos

重要知识点

  • Nacos属性的简单使用
  • 将SpringBoot中的所有配置全部放入到Nacos中
  • 开发人创建单独的命名空间,修改互不影响
  • Nacos经常变动的配置抽离到外部文件中

将项目中的所有配置全部放到到

1. 首先引入包
		<!-- nacos 接入--><!-- https://mvnrepository.com/artifact/com.alibaba.boot/nacos-config-spring-boot-starter --><dependency><groupId>com.alibaba.boot</groupId><artifactId>nacos-config-spring-boot-starter</artifactId><version>最新版本号</version></dependency>
2. 配置Nacos的配置文件
  • 主配置; 主要是加载 静态配置 文件的; SpringBoot在启动的时候会先去Nacos中读取配置文件然后加载到Environment中; 静态配置不启用自动刷新;

    #(下面的配置中只需要吧对应的data-ids、group、data-id 、server-addr、namespace修改为对应数据)#

    -----------------静态文件配置(启动的时候最优先加载 log-enable: true)--------------

    nacos:
    config:
    bootstrap:
    log-enable: true # 支持日志级别的加载时机(如果需要集成dubbo,请使用此配置加载时机)
    enable: true # 设置参数nacos.config.bootstrap.enable=true,开启配置预加载功能

    max-retry: 10 # 主配置 最大重试次数
    auto-refresh: false # 主配置 是否开启自动刷新 (false:不监听属性变化,true:监听属性变化,但是对应的属性注解上也必须设置autoRefreshed = true才可以实时更新)
    config-retry-time: 3000 # 主配置 重试时间
    config-long-poll-timeout: 30000 # 主配置 配置监听长轮询超时时间
    enable-remote-sync-config: false # 主配置 开启注册监听器预加载配置服务(除非特殊业务需求,否则不推荐打开该参数)
    #允许nacos上的配置优先于本地配置; 意思是:如果nacos配置了某属性,然后在本地的application.yml配置了相同属性;那么会以nacos配置的优先;否则是本地的优先
    remote-first: true# 主配置 data-ids  (可以配置多个,如果多个配置文件中有相同的 属性 则优先取最前面的值)
    data-ids: application-static.properties,logback-static.xml
    group: PROJECT_EXAMPLE # 主配置 group-id
    type: yaml # 主配置 配置文件类型
    server-addr: 127.0.0.1:8848
    namespace: # 命名空间
    name: nacos
    password: nacos
    

上面的静态配置修改最后面的几个属性就行了;

  • 动态配置 动态配置有两种配置 一种是在yml配置文件中配置

    nacos:
    config:
    ext-config[0]:
    data-id: dynamic.properties
    group: PROJECT_EXAMPLE
    #namespace: # 命名空间 该属性如果为空 或者注释该属性 会继承主属性的命名空间
    # 该属性不继承上面的主配置 是否开启自动刷新 (false:不监听属性变化,true:监听属性变化,但是对应的属性注解上也必须设置autoRefreshed = true才可以实时更新)
    auto-refresh : true
    type: properties # 类型 {@link com.alibaba.nacos.api.config.ConfigType}

    ## 如果还想加载其他的配置  copy一下 数组改成1 例如ext-config[1]ext-config[1]:data-id:  dynamic.yamlgroup: PROJECT_EXAMPLE#namespace:  # 命名空间 该属性如果为空 或者注释该属性  会继承主属性的命名空间# 该属性不继承上面的主配置    是否开启自动刷新 (false:不监听属性变化,true:监听属性变化,但是对应的属性注解上也必须设置autoRefreshed = true才可以实时更新)auto-refresh: truetype: yaml  # 类型 {@link com.alibaba.nacos.api.config.ConfigType}
    

一种用注解的形式@NacosPropertySource 例如上面的动态配置跟下面效果一样

@NacosPropertySource(dataId = "dynamic.properties",groupId = "PROJECT_EXAMPLE",type = ConfigType.PROPERTIES,autoRefreshed = true)
@NacosPropertySource(dataId = "dynamic.yaml",groupId = "PROJECT_EXAMPLE",type = ConfigType.YAML,autoRefreshed = true)

两者的区别: @NacosPropertySource不可以单独指定namespace; 配置文件的方式可以单独指定namespace ; 如果他们都不指定的话,默认继承自 主配置中的namespace配置

3.Nacos的简单应用
3.1 使用@NacosConfigurationProperties将配置绑定到对象中

例子:

/*** @author shirenchuang* @date 2020/10/20  9:56 上午** 将配置中的 list 和listMap 解析并绑定到这个对象中* 并可以使用 @Autowired注解使用这个对象** nacos中的配置:** test.list:*     - 1*     - 2*     - 3*     - 4* test.listMap:*     key-1:*         - 1*         - 2*         - 3*         - 4*     key-2:*         - aa*         - dd*         - ee*         - rr***/@NacosConfigurationProperties( prefix = "test1",dataId = "test.yaml",groupId = "PROJECT_EXAMPLE",type = ConfigType.YAML, autoRefreshed = true)
@Configuration
public class Apple {private List<String> list;private Map<String, List<String>> listMap;public List<String> getList() {return list;}public void setList(List<String> list) {this.list = list;}public Map<String, List<String>> getListMap() {return listMap;}public void setListMap(Map<String, List<String>> listMap) {this.listMap = listMap;}@Overridepublic String toString() {return "Apple{" + "list=" + list + ", listMap=" + listMap + '}';}
}

使用的时候就直接用注解@Autowired可以直接使用

@Autowired private Apple apple;
3.2 使用@NacosValue获取属性
    // 是否自动刷新属性 必须在每个属性上都要标注@NacosValue(value = "${name:66}",autoRefreshed = true)private String name;

如果属性值不存在就取 冒号 后面的默认值;

3.3 也可以使用@Value来获取Nacos配置中的属性值
    @NacosValue(value = "${spring.datasource.url}",autoRefreshed = true)private String url;@Value(value = "${spring.datasource.url}")private String url2;

例如上面的spring.datasource.url的属性是配置在nacos中的;但是上面两个注解都正常打印出来了它的值,为什么呢?@Value是从Spring容器中的Environment中获取对应的属性值,但是在启动Nacos的时候就把数据给加载到了Environment中去了; 所以通过@Value也能获取到属性值; 但是它跟@NacosValue的区别是, 它不能够实时刷新数据; 它的值一直都是启动时候第一遍加载的数据 所以我们也可以用@Value来获取我们在Nacos中配置的静态数据;作用是一样的 【SpringBoot】配置文件的加载与属性值的绑定

4.将Nacos一部分配置移动到外部文件中

我们在开发过程中,会经常涉及到配置文件的改动; 还有发布的时候不同环境用不同的配置; 这些配置写在项目的属性文件里面不太妥当; 最好是能够单独拎出来;

例如上面主配置中的 几个属性在不同环境中会经常频繁改动;那我们把他们单独拎出来存放到外部配置文件中;

在这里插入图片描述

Spring中读取外部配置文件的方式有很多;但是有一点很重要;就是加载时机的问题 例如@PropertySource()这个注解基本上是等容器都启动完成的时候才去解析的; 那么我们启动项目的时候是一开始就加载了Nacos的; 就必须我们在加载Nacos的配置文件之前就必须把Nacos需要的配置数据准备好并加载到 Environment 中去; 相关知识点可以参考: 【Spring Boot 四】启动之准备系统环境environmentPrepared 【SpringBoot】SpringBoot启动流程图和扩展点说明

那么最终决定我们可以选择 实现一个 EnvironmentPostProcessor扩展类;

NacosEnvPostProcessor扩展类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.boot.logging.DeferredLog;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.core.Ordered;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertySource;
import org.springframework.core.env.StandardEnvironment;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.io.support.DefaultPropertySourceFactory;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.core.io.support.PropertySourceFactory;
import org.springframework.util.StringUtils;import java.io.IOException;/*** @author shirenchuang* @date 2020/7/22  4:58 下午** 这个优先级必须要比 NacosConfigEnvironmentProcessor 的优先级高* 不然的话 NacosConfigEnvironmentProcessor 执行的时候 会取不到 Nacos的这几个配置属性* 将文件中的属性放到 系统环境变量中; 优先级只会比StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME低*/import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.boot.logging.DeferredLog;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.core.Ordered;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertySource;
import org.springframework.core.env.StandardEnvironment;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.io.support.DefaultPropertySourceFactory;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.core.io.support.PropertySourceFactory;
import org.springframework.util.StringUtils;import java.io.IOException;/*** @author shirenchuang* @date 2020/7/22  4:58 下午* 在最初的时候将 外部配置文件属性加载到容器中** 这个优先级必须要比 NacosConfigEnvironmentProcessor 的优先级高* 不然的话 NacosConfigEnvironmentProcessor 执行的时候 会取不到 Nacos的这几个配置属性* 将文件中的属性放到 系统环境变量中; 优先级只会比StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME低*/public class ExternalFilePostProcessor implements EnvironmentPostProcessor, ApplicationListener<ApplicationEvent>, Ordered {/*** 这个时候Log系统还没有初始化  使用DeferredLog来记录  并在onApplicationEvent进行回放* */private static final DeferredLog LOGGER = new DeferredLog();private  ResourceLoader resourceLoader = new DefaultResourceLoader();@Overridepublic int getOrder() {return 0;}/*** 将文件中的nacos配置文件 加载到 environment中;* 方便Nacos可以拿到 静态配置** @param environment* @param application*/@Overridepublic void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {String filePath = environment.getProperty("nacos_file_path");if(StringUtils.isEmpty(filePath)){LOGGER.info("[----未配置外部属性路径-----] 
");return;}String resolvedLocation = environment.resolveRequiredPlaceholders(filePath);resolvedLocation = "file:"+resolvedLocation;PropertySourceFactory factory = new DefaultPropertySourceFactory();Resource resource = this.resourceLoader.getResource(resolvedLocation);try {addPropertySource(factory.createPropertySource(filePath, new EncodedResource(resource)),environment);} catch (IOException e) {LOGGER.error(" 外部配置路径 - Properties location [" + filePath + "] not resolvable: " + e.getMessage());}}private void addPropertySource(PropertySource<?> propertySource,ConfigurableEnvironment environment) {MutablePropertySources propertySources = environment.getPropertySources();//添加到 systemEnvironment  优先级只比 系统属性 和命令行属性等等的低propertySources.addAfter(StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, propertySource);}@Overridepublic void onApplicationEvent(ApplicationEvent event) {LOGGER.replayTo(ExternalFilePostProcessor.class);}
}

然后配置一下spring.factories;

org.springframework.boot.env.EnvironmentPostProcessor=com.daimler.example.service.common.NacosEnvPostProcessor

在这里插入图片描述

相关知识点 【SpringBoot 二】spring.factories加载时机分析

然后本地创建一个文件 aml

在yml中配置文件路径

#nacos 的基本配置(放在服务器本地文件上, 包含  nacos.config.server-addr、 nacos.config.namespace、 username、password)
nacos_file_path: /**/**/nacos_static/project_example-nacos.properties
Spring中实现上面的功能没有那么复杂
@EnableNacosConfig(globalProperties = @NacosProperties(username = "${nacos.config.username}", password = "${nacos.config.password}",serverAddr = "${nacos.config.server-addr}",namespace = "${nacos.config.namespace}"   ))
@NacosPropertySource(dataId = "dynamic.yaml",groupId = "PROJECT_EXAMPLE",type = ConfigType.YAML,autoRefreshed = true)
public class NacosConfig {}@Configuration
@PropertySource(value = "file:/etc/nacos.properties")
@ComponentScan(basePackages = "com.xx")
@Import( value = {NacosConfig.class})
public class SpringConfig {}

然后外部配置文件配置 aml

5.每个开发人员一套自己的配置

在本地开发过程中,我们可能会经常修改配置文件;但可能改了之后会影响到别人;就有这样的需求;我改配置的时候 只影响我自己;

我们可以看到上面的配置中 有一个配置 nacos.config.namespace= ; 这个是命名空间;通过这样一个属性我们可以应用不同的配置;

具体用法

  • 新建一个属于自己的命名空间 在这里插入图片描述
  • 将需要克隆的配置 从指定空间克隆到自己刚刚创建的空间 在这里插入图片描述
  • 将自己本地nacos属性配置的namespace 改成自己刚刚创建的命名空间id(注意是 ID)
  • 重新启动,搞定!
完整的yml配置
#nacos 的基本配置(放在服务器本地文件上, 包含  nacos.config.server-addr、 nacos.config.namespace、 username、password)
nacos_file_path: /**/**/nacos_static/project_example-nacos.properties#(下面的配置中只需要吧对应的data-ids、group、data-id 修改为对应数据)### -----------------静态文件配置(启动的时候最优先加载 log-enable: true)-------------- ##
nacos:config:bootstrap:log-enable: true # 支持日志级别的加载时机(如果需要集成dubbo,请使用此配置加载时机)enable: true # 设置参数nacos.config.bootstrap.enable=true,开启配置预加载功能max-retry: 10 # 主配置 最大重试次数auto-refresh: false # 主配置 是否开启自动刷新 (false:不监听属性变化,true:监听属性变化,但是对应的属性注解上也必须设置autoRefreshed = true才可以实时更新)config-retry-time: 3000 # 主配置 重试时间config-long-poll-timeout: 30000 # 主配置 配置监听长轮询超时时间enable-remote-sync-config: false # 主配置 开启注册监听器预加载配置服务(除非特殊业务需求,否则不推荐打开该参数)#允许nacos上的配置优先于本地配置; 意思是:如果nacos配置了某属性,然后在本地的application.yml配置了相同属性;那么会以nacos配置的优先;否则是本地的优先remote-first: true# 主配置 data-ids  (可以配置多个,如果多个配置文件中有相同的 属性 则优先取最前面的值)data-ids: 静态配置1,静态配置2,logback.xmlgroup: 自己的group # 主配置 group-idtype: yaml # 主配置 配置文件类型## ---------------如果 使用配置方式就是下面的; 如果用@NacosPropertySource注解方式就删掉下面的 ---------------------------  ##ext-config[0]:data-id:  自己的data-idgroup: 自己的group#namespace:  # 命名空间 该属性如果为空 或者注释该属性  会继承主属性的命名空间# 该属性不继承上面的主配置    是否开启自动刷新 (false:不监听属性变化,true:监听属性变化,但是对应的属性注解上也必须设置autoRefreshed = true才可以实时更新)auto-refresh : truetype: properties  # 类型 {@link com.alibaba.nacos.api.config.ConfigType}## 如果还想加载其他的配置  copy一下 数组改成1 例如ext-config[1]ext-config[1]:data-id:  自己的data-idgroup: 自己的group#namespace:  # 命名空间 该属性如果为空 或者注释该属性  会继承主属性的命名空间# 该属性不继承上面的主配置    是否开启自动刷新 (false:不监听属性变化,true:监听属性变化,但是对应的属性注解上也必须设置autoRefreshed = true才可以实时更新)auto-refresh: truetype: yaml  # 类型 {@link com.alibaba.nacos.api.config.ConfigType}

外部配置文件 /**/**/nacos_static/project_example-nacos.properties

# 主配置服务器地址nacos.config.server-addr=127.0.0.1:8848nacos.config.username=nacosnacos.config.password=nacos# 命名空间 (空为默认的public)nacos.config.namespace=

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/35105.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【每天一篇深度学习论文】轻量化自适应提取模块LAE

目录 论文介绍题目&#xff1a;论文地址&#xff1a; 创新点方法模型总体架构核心模块描述1. 轻量级自适应提取&#xff08;LAE&#xff09;模块&#xff1a;2. 多路径旁路特征匹配&#xff08;MSFM&#xff09;模块&#xff1a;3. RFABlock&#xff08;感受野注意力卷积&#…

Linux中文件操作

文件由文件内容和文件属性构成&#xff0c;因此对文件的操作就是对文件内容或文件属性的操作。所谓的“打开一个文件”就是将文件的属性或内容加载到内存中&#xff0c;而没有被打开的文件存在于磁盘上。打开的文件称作“内存文件”&#xff0c;未被打开的文件称作“磁盘文件”…

hhdb数据库介绍(10-42)

安全 SQL防火墙 管理平台提供的SQL防火墙功能可为用户拦截高危SQL、误操作SQL等&#xff0c;提升系统安全性。 同时防火墙提供观测功能&#xff0c;可在开启新规则前&#xff0c;通过开启观测状态&#xff0c;判断新规则对业务的影响程度。开启观测状态后&#xff0c;计算节…

白嫖VMware ESXi 8.0 U3新功能Live Patch、无需重启零中断修复漏洞

哈喽大家好&#xff0c;欢迎来到虚拟化时代君&#xff08;XNHCYL&#xff09;&#xff0c;收不到通知请将我点击星标&#xff01;“ 大家好&#xff0c;我是虚拟化时代君&#xff0c;一位潜心于互联网的技术宅男。这里每天为你分享各种你感兴趣的技术、教程、软件、资源、福利…

JavaSE学习心得(API与算法篇)

常用API和常见算法 前言 常用API Math System Runtime Object ​编辑浅克隆 深克隆 Objects Biginteger 构造方法 成员方法 底层存储方式 Bigdecimal 构造方法 Bigdecimal的使用 底层存储方式 ​编辑正则表达式 两个判断练习 两个爬取练习 贪婪爬取和非贪…

如何开发高效的企业内训APP?教育培训系统源码搭建实战详解

本篇文章&#xff0c;小编将从教育培训系统的源码搭建、功能设计以及技术实现等方面&#xff0c;详细探讨如何开发一款高效的企业内训APP。 一、企业内训APP的需求分析 在开发企业内训APP之前&#xff0c;首先需要明确其基本需求。一个高效的企业内训APP应该具备以下几个核心…

解释器模式的理解和实践

引言 解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为型设计模式&#xff0c;它在软件工程中用得相对较少&#xff0c;但在某些特定场景下非常有用。解释器模式提供了一种解释语言的语法或表达式的方式&#xff0c;它定义了一个表达式接口&#xff0c;并通过…

Z029 PHP+MYSQL+LW+饭店预订管理系统的设计与实现 源代码 配置 文档

饭店预订管理系统 1.项目描述2. 开发背景与意义3.项目功能结构4.界面展示5.源码获取 1.项目描述 近几年来&#xff0c;我国计算机信息技术发展迅速&#xff0c;各种各样的信息管理系统层出不穷。互联网电子商务的热潮&#xff0c;改变了人们生活习惯&#xff0c;而作为城市经济…

【力扣热题100】—— Day5.回文链表

正视自己的懦弱和无能&#xff0c;克服自己的嫉妒与不甘 —— 24.12.3 234. 回文链表 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为 回文链表 。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a…

什么是大数据、有什么用以及学习内容

目录 1.什么是大数据&#xff1f; 1.1大数据的类型 1.2大数据的来源 1.3大数据处理的挑战 1.4大数据的核心技术 2.大数据有什么用&#xff1f; 2.1商业与营销&#xff1a; 2.2医疗与健康&#xff1a; 2.3金融服务&#xff1a; 2.4政府与公共服务&#xff1a; 2.5交通…

Docker 安装 中文版 GitLab

Docker 安装系列 安装GitLab、解决服务器内存不足问题、使用域名/IP地址访问项目 1、拉取 [rootTseng ~]# docker pull twang2218/gitlab-ce-zh:latest latest: Pulling from twang2218/gitlab-ce-zh 8ee29e426c26: Pull complete 6e83b260b73b: Pull complete e26b65fd11…

分布式数据库环境(HBase分布式数据库)的搭建与配置

分布式数据库环境&#xff08;HBase分布式数据库&#xff09;的搭建与配置 1. VMWare安装CentOS7.9.20091.1 下载 CentOS7.9.2009 映像文件1.2启动 VMware WorkstationPro&#xff0c;点击“创建新的虚拟机”1.3在新建虚拟机向导界面选择“典型&#xff08;推荐&#xff09;”1…

ssh连接工具

我们未来接触到的linux系统一般情况下是没有界面&#xff08;桌面环境&#xff09;&#xff0c;我们一般会在自己工作的电脑上&#xff0c;通过相关ssh工具&#xff0c;利用网络连接到远程的你的服务器上。连接工具有很多&#xff1a;mobaxterm、xshell/xftp、putty等等 mobaxt…

苹果 ATS 配置SSL证书

Apple的App Transport Security (ATS) 是一项安全机制&#xff0c;旨在确保iOS和macOS应用的网络通信使用HTTPS加密。自iOS 9和OS X 10.11以来&#xff0c;默认情况下所有网络请求都必须使用HTTPS&#xff0c;除非明确允许非HTTPS连接。 在2017年1月1日之前&#xff0c;开发者可…

安卓逆向之对抗Anti-Frida学习

基础补充 什么是 Anti-Frida 保护&#xff1f; Anti-Frida保护是指在移动应用或程序中采用的一种安全技术或防护机制&#xff0c;旨在防止或干扰Frida等动态分析工具的注入与使用。 Anti-Frida保护常见技术 有哪些&#xff1f; 检测frida-agent.so的注入 &#xff1a; Fr…

安全架构评审

安全架构评审 1.概述2.安全设计原则3.美团安全架构评审模型安全需求分析架构review攻击面分析和威胁建模攻击面分析威胁列表 1.概述 完整的安全评审会包含安全架构评审、安全代码审核和安全测试三个手段 安全架构评审聚焦于探寻安全设计中的漏洞&#xff0c;以宏观视野全面考…

迎接国庆,我上线了第一款小程序

最近花了些时间&#xff0c;写了一个 “国庆头像” 小程序。正好快国庆节了&#xff0c;于是分享一下我的这个 “Starstick星点贴纸” 小程序&#xff0c;顺便简单讲讲以及其中的设计、开发、上线过程。 小程序的界面是这样的&#xff1a; &#x1f52e;背景 今年中秋前夕&am…

房产销售系统

文末获取源码和万字论文&#xff0c;制作不易&#xff0c;感谢点赞支持。 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于房产销售系统当然也不能排除在外&#xff0c;随着网络技术的不…

开发一套ERP 第二个生产版本

库存管理第一个生产版本 Okay 进入测试 嘿嘿,搞完了,剩下的就是细测慢调了 下一版本可以内置sqlite 数据库来操作这些数据表,sqlite 也支持 trigger 的功能

Weiss 机器人电动夹爪,重塑工业自动化精密操作

在当今的自动化进程里&#xff0c;Weiss高精密电动夹爪扮演着重要的角色。Weiss公司位于德国&#xff0c;其精心研制的高精密电动夹爪专为工业机器人与协作机器人打造。 Weiss 高精密电动夹爪的控制方式独具特色&#xff0c;与传统的一些夹爪相比&#xff0c;Weiss电动夹爪在处…