与鸿蒙同行,Java Solon v3.0 正式发布(向下兼容)

与 HarmonyOS NEXT 10月8日公测同行。Solon (开放原子开源基金会,孵化项目) v3.0 正式发布,
且将在 2025 年启动华为编程语言 “仓颉” 版开发(届时会有 Solon-Java 和 Solon-CJ 两大版本)。本次大版本更新,费时多月:

  • 与 Solon v2.9 保持兼容(向下兼容)
  • 与 JDK8, JDK11, JDK17, JDK21, JDK23 保持兼容(全系兼容)

Solon 框架!

Java “新式”应用开发框架,2017~2024。从零开始构建(非 java-ee 架构),有灵活的接口规范与开放生态

  • 追求: 更快、更小、更简单
  • 提倡: 克制、简洁、高效、开放、生态
  • 官网: https://solon.noear.org

有什么特点?

特点描述
更高的计算性价比并发高 300%;内存省 50%
更快的开发效率代码少;入门快;调试重启快 10 倍
更好的生产与部署体验打包小 90%
更大的兼容范围非 java-ee 架构;同时支持 java8 ~ java23,graalvm native image

更新与兼容详细说明:

1、概述

v3.0 版本主要是,内核删除了 20Kb 的弃用代码及相应的调整。最新内核为 0.3Mb。

  • 移除的配置,要认真检查;
  • 移除的事件,要认真检查;
  • 弃用接口移除等编译时会出错提醒,问题不大。

新增或重构插件有:

  • solon-data-sqlutils(编译大小为 10Kb 的小工具)
  • solon-web-webservices
  • solon-net-stomp
  • nami-channel-http(用于替代 nami-channel-http-okhttp)
  • solon-net-httputils(重构,添加 HttpURLConnection 适配;编译大小为 40Kb)

2、弃用配置移除对应表(要认真检查)

  • 移除
类型移除配置名替代配置名
启动参数solon::
- configconfig.add
应用属性solon::
- solon.configsolon.config.add
  • 弃用
类型弃用配置名替代配置名
应用属性solon-boot::
- server.session.state.domainserver.session.cookieDomain
- server.session.state.domain.autoserver.session.cookieDomainAuto
solon-web-staticfiles::
- solon.staticfiles.maxAgesolon.staticfiles.cacheMaxAge

3、弃用事件移除对应表(要认真检查)

插件移除事件替代方案
solon@Bean bean?getBeanAsync(…class, …) / @Inject ..
@Component bean?getBeanAsync(…class, …) / @Inject ..
solon-serialization-fastjsonFastjsonActionExecutorgetBeanAsync(…class, …) / @Inject ..
FastjsonRenderFactorygetBeanAsync(…class, …) / @Inject ..
solon-serialization-fastjson2Fastjson2ActionExecutorgetBeanAsync(…class, …) / @Inject ..
Fastjson2RenderFactorygetBeanAsync(…class, …) / @Inject ..
solon-serialization-furyFuryActionExecutorgetBeanAsync(…class, …) / @Inject ..
solon-serialization-gsonGsonActionExecutorgetBeanAsync(…class, …) / @Inject ..
GsonRenderFactorygetBeanAsync(…class, …) / @Inject ..
solon-serialization-hessianHessianActionExecutorgetBeanAsync(…class, …) / @Inject ..
solon-serialization-jacksonJacksonActionExecutorgetBeanAsync(…class, …) / @Inject ..
JacksonRenderFactorygetBeanAsync(…class, …) / @Inject ..
solon-serialization-jackson-xmlJacksonXmlActionExecutorgetBeanAsync(…class, …) / @Inject ..
JacksonXmlRenderFactorygetBeanAsync(…class, …) / @Inject ..
solon-serialization-propertiesPropertiesActionExecutorgetBeanAsync(…class, …) / @Inject ..
PropertiesRenderFactorygetBeanAsync(…class, …) / @Inject ..
solon-serialization-protostuffProtostuffActionExecutorgetBeanAsync(…class, …) / @Inject ..
solon-serialization-snack3SnackActionExecutorgetBeanAsync(…class, …) / @Inject ..
SnackRenderFactorygetBeanAsync(…class, …) / @Inject ..
solon-view-beetlGroupTemplategetBeanAsync(BeetlRender.class, …) / @Inject ..
solon-view-enjoyEnginegetBeanAsync(EnjoyRender.class, …) / @Inject ..
solon-view-freemarkerConfigurationgetBeanAsync(FreemarkerRender.class, …) / @Inject ..
solon-view-thymeleafTemplateEnginegetBeanAsync(ThymeleafRender.class, …) / @Inject ..
solon-view-velocityRuntimeInstancegetBeanAsync(VelocityRender.class, …) / @Inject ..

以上事件替代的扩展方案(示例):

@Configuration
public class App {
    public static void main(String[] args) {
        Solon.start(App.class, args, app -> {
            //1.第一时间手动获取(在其它注入前执行)
            app.context().getBeanAsync(Xxx.class, e -> {

            });
        });
    }

    //2.由扫描时自动注入
    @Bean
    public void cfg(Xxx xxx) {

    }
}

什么时候用事件扩展好(尽量不用)?

  • 需要及时扩展,但又不方便进入容器的对象。

4、弃用 Before、After 处理体系移除(编译会有提醒)

影响替代方案
全局方面RouterInterceptor 替代
本地网关方面Filter 替代,或者自己可扩展
注解方面(控制器相关)@Addition(Filter) 替代

其中“本地网关”,可以通过定制恢复旧版能力:https://solon.noear.org/article/214

5、弃用类型移除对应表(编译会有提醒)

插件移除类型替代类型
nami
@Body@NamiBody
NamiBodyAnno
@Mapping@NamiMapping
NamiMappingAnno
solon
@PathVar@Path
@PropertySource@Import
@ProxyComponent@Component
@Before(Handler)@Addition(Filter)
@After(Handler)@Addition(Filter)
Endpoint/
SolonBuilder/
ValHolder/
InitializingBean@Init
NdMapIgnoreCaseMap<Object>
solon-data
Serializercore::Serializer
solon-data-dynamicds
DynamicDsHolderDynamicDsKey
solon-logging
LogUtilToSlf4j/
solon-logging-log4j
SolonCloudAppender/
solon-logging-logback
SolonCloudAppender/
solon-serialization
JsonConvertercore::Converter
StringSerializercore::Serializer<String>
solon-test
@TestPropertySource@Import
@TestRollback@Rollback
AbstractHttpTesterHttpTester
HttpTestBaseHttpTester

6、弃用接口方法移除对应表(编译会有提醒)

调整类移除方法(或字段)替代方法
nami::
- ConstantsCONTENT_TYPE_*
solon::
- ActionParamResolverresolvePathVar()
- ActionDefaultbefore(.)/ 只留 filter 体系
after(.)/
- AppContextbeanOnloaded(.)lifecycle(.)
- Beanregistered()delivered()
- BeanContainergetAttrs()attachment*(.)
beanAround*(.)beanInterceptor*(.)
- ClassUtilnewInstance(.)tryInstance(.)
- ClassWrapgetFieldAllWraps()getFieldWraps()
- Componentregistered()delivered()
- ConditionUtilifMissing(.)ifMissingBean(.)
- Contextip()remoteIp()
param(key,def)paramOrDefault(key,def)
paramSet(.)paramMap().add(.)
paramsMap()paramMap().toValuesMap()
paramsAdd(.)paramMap().add(.)
files(.)fileValues(.)
filesMap()fileMap().toValuesMap()
cookie(key,def)cookieOrDefault(key,def)
header(key,def)headerOrDefault(key,def)
headersMap()headerMap().toValuesMap()
session(key,def)sessionOrDefault(key,def)
statusSet(.)status(.)
attr(key,def)attrOrDefault(key,def)
attrClear()attrsClear()
- DateAnalyzergetGlobal()global()
- EventBuspushAsync()publishAsync()
pushTry()publishTry()
push()publish()
- Gatewaybefore(.)/ 只留 filter 体系
after(.)/
- LifecycleBeanprestop()preStop()
- LogUtildebugAsync()/
infoAsync()/
- MethodHoldergetArounds()getInterceptors()
- MethodWrapgetArounds()getInterceptors()
- MvcFactoryresolveParam(.)resolveActionParam(.)
- NvMap(map)from(map)
getBean(.)toBean(.)
- PropsgetByParse(.)getByTmpl(.)
getXmap(.)getMap(.)
getBean(.)toBean(.)
- RenderManagermapping(.)Solon.app().render(key, )
register(.)Solon.app().render(null, .)
- ResourceUtilremClasspath(.)remSchema(.)
- RoutermatchOne(.)matchMain(.)
- RunUtilsetExecutor(.)setParallelExecutor(.)
- SolonAppbefore(.)/ 只留 filter 体系
after(.)/
- SolonPropssource()app.source()
sourceLocation()app.sourceLocation()
- UtilsTAG_classpath/
resolvePaths(.)/
hasClass(.)ClassUtil.hasClass(.)
loadClass(.)ClassUtil.loadClass(.)
newInstance(.)ClassUtil.tryInstance(.)
getResource*(.)ResourceUtil.getResource*(.)
transferTo*(.)IoUtil.transferTo*(.)
buildExt(.)getFolderAndMake(.)
solon-boot::
- HttpServerConfigureallowSsl(.)enableSsl(.)
solon-data::
- CacheServiceget(key)get(key, type)
solon-scheduling::
- IJobManagersetJobInterceptor(.)addJobInterceptor(.)
solon-serialization-properties::
- PropertiesActionExecutorincludeFormUrlencoded(.)allowPostForm(.)

7、弃用插件移除对应表

其中简化了快捷组合包(发现太多,容易混乱),只留两个基础的:

  • solon-lib(保持不变)
  • solon-web(移除了 solon-view-freemarker)
移除插件替代插件备注
:: cloud
solon.cloud.httputilssolon-net-httputils
:: detector
detector-solon-pluginsolon-health-detector
:: logging
log4j2-solon-pluginsolon-logging-log4j2
logback-solon-pluginsolon-logging-logback
:: scheduling
solon.extend.schedule/
:: testing
solon.testsolon-test
:: web
solon.web.fluxsolon-web-rx
:: shortcuts
solon-apisolon-web
solon-job/改用 solon-lib +
solon-rpc/改用 solon-web +
solon-beetl-web/改用 solon-web +
solon-enjob-web/改用 solon-web +
solon-web-beetl/改用 solon-web +
solon-web-enjoy/改用 solon-web +
solon-cloud-alibaba/改用 solon-web + solon-cloud +
solon-cloud-water/改用 solon-web + solon-cloud +

移除的快捷组合包,可通过以下方式组合:

  • solon-job=
    • solon-lib + solon-scheduling-simple
  • solon-rpc=
    • solon-web + nami-coder-snack3 + nami-channl-http-okhttp
  • solon-beetl-web(或 solon-web-beetl)=
    • solon-web + solon-view-beetl + beetlsql-solon-plugin
  • solon-enjoy-web(或 solon-web-enjoy)=
    • solon-web + solon-view-enjoy + activerecord-solon-plugin
  • solon-cloud-alibaba=
    • solon-web + solon-cloud + nacos-solon-cloud-plugin + rocketmq-solon-cloud-plugin + sentinel-solon-cloud-plugin
  • solon-cloud-water=
    • solon-web + solon-cloud + water-solon-cloud-plugin

8、部分插件名字调整对应表(旧名标为弃用,仍可用)

新的调整按以下插件命名规则执行:

插件命名规则说明
solon-*(由 solon.* 调整而来)表示内部架构插件
*-solon-plugin(保持不变)表示外部适配插件
*-solon-cloud-plugin(保持不变)表过云接口外部适配插件

对应的“旧名”,仍可使用。预计会保留一年左右。具体调整如下:

新名旧名备注
:: nami
nami-channel-http-hutoolnami.channel.http.hutool
nami-channel-http-okhttpnami.channel.http.okhttp
nami-channel-socketdnami.channel.socketd
nami-coder-fastjsonnami.coder.fastjson
nami-coder-fastjson2nami.coder.fastjson2
nami-coder-furynami.coder.fury
nami-coder-hessiannami.coder.hessian
nami-coder-jacksonnami.coder.jackson
nami-coder-protostuffnami.coder.protostuff
nami-coder-snack3nami.coder.snack3
:: base
solon-config-bannersolon.banner
solon-config-yamlsolon.config.yaml
solon-config-plus从原 solon.config.yaml 里拆出来
solon-hotplugsolon.hotplug
solon-i18nsolon.i18n
solon-mvcsolon.mvc
solon-proxysolon.proxy
solon-rx新增
:: boot
solon-boot-jdkhttpsolon.boot.jdkhttp
solon-boot-jetty-add-jspsolon.boot.jetty.add.jsp
solon-boot-jetty-add-websocketsolon.boot.jetty.add.websocket
solon-boot-jettysolon.boot.jetty
solon-boot-jlhttpsolon.boot.jlhttp
solon-boot-smarthttpsolon.boot.smarthttp
solon-boot-socketdsolon.boot.socketd
solon-boot-undertow-add-jspsolon.boot.undertow.add.jsp
solon-boot-undertowsolon.boot.undertow
solon-boot-vertxsolon.boot.vertx
solon-boot-websocket-nettysolon.boot.websocket.netty
solon-boot-websocketsolon.boot.websocket
solon-bootsolon.boot
:: cloud
solon-cloud-eventplussolon.cloud.eventplus
solon-cloud-gatewaysolon.cloud.gateway
solon-cloud-metricssolon.cloud.metrics
solon-cloud-tracingsolon.cloud.tracing
solon-cloudsolon.cloud
:: data
solon-cache-caffeinesolon.cache.caffeine
solon-cache-jedissolon.cache.jedis
solon-cache-redissonsolon.cache.redisson
solon-cache-spymemcachedsolon.cache.spymemcached
solon-data-dynamicdssolon.data.dynamicds
solon-data-shardingdssolon.data.shardingds
solon-datasolon.data
:: detector
solon-health-detectorsolon.health.detector
solon-healthsolon.health
:: docs
solon-docs-openapi2solon.docs.openapi2
solon-docs-openapi3
solon-docssolon.docs
:: faas
solon-faas-luffysolon.luffy
:: logging
solon-logging-log4j2solon.logging.log4j2
solon-logging-logbacksolon.logging.logback
solon-logging-simplesolon.logging.simple
solon-loggingsolon.logging
:: native
solon-aotsolon.aot
::net
solon-net-httputilssolon.net.httputils
solon-net-stomp
solon-netsolon.net
:: scheduling
solon-scheduling-quartzsolon.scheduling.quartz
solon-scheduling-simplesolon.scheduling.simple
solon-schedulingsolon.scheduling
:: security
solon-security-authsolon.auth旧名弃用
solon-security-validationsolon.validation旧名弃用
solon-security-vaultsolon.vault旧名弃用
solon-security-authsolon.security.auth
solon-security-validationsolon.security.validation
solon-security-vaultsolon.security.vault
:: serialization
solon-serializationsolon.serialization
solon-serialization-fastjsonsolon.serialization.fastjson
solon-serialization-fastjson2solon.serialization.fastjson2
solon-serialization-furysolon.serialization.fury
solon-serialization-gsonsolon.serialization.gson
solon-serialization-hessiansolon.serialization.hessian
solon-serialization-jacksonsolon.serialization.jackson
solon-serialization-jackson-xmlsolon.serialization.jackson.xml
solon-serialization-kryo略过(未发布)
solon-serialization-propertiessolon.serialization.properties
solon-serialization-protostuffsolon.serialization.protostuff
solon-serialization-snack3solon.serialization.snack3
:: view
solon-viewsolon.view
solon-view-beetlsolon.view.beetl
solon-view-enjoysolon.view.enjoy
solon-view-freemarkersolon.view.freemarker
solon-view-jspsolon.view.jsp
solon-view-jsp-jakarta略过(未发布)
solon-view-thymeleafsolon.view.thymeleaf
solon-view-velocitysolon.view.velocity
:: web
solon-sessionstate-jedissolon.sessionstate.jedis
solon-sessionstate-jwtsolon.sessionstate.jwt
solon-sessionstate-localsolon.sessionstate.local
solon-sessionstate-redissonsolon.sessionstate.redisson
solon-web-corssolon.web.cors
solon-web-rxsolon.web.rx
solon-web-sdlsolon.web.sdl
solon-web-servletsolon.web.servlet
solon-web-servlet-jakartasolon.web.servlet.jakarta
solon-web-ssesolon.web.sse
solon-web-staticfilessolon.web.staticfiles
solon-web-stopsolon.web.stop
solon-web-webdavsolon.web.webdav

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

免费送源码:Java+Springboot+MySQL 水环境检测系统的设计与实现 计算机毕业设计原创定制

摘 要 在我国,水源的污染是不可忽视的问题。对于水质监测进行数据的采集工作,目前主要通过人工实现。因此,部分地区的采集工作,实施起来难度很大,比如恶劣环境和偏僻山区等地。所以,目前对于水质监测的研究,主导方向是建立更加高效完善,智能化的水质监测系统。近几年,无线传感器…

【C++贪心 DFS】2673. 使二叉树所有路径值相等的最小代价|1917

本文涉及知识点 C贪心 反证法 决策包容性 CDFS LeetCode2673. 使二叉树所有路径值相等的最小代价 给你一个整数 n 表示一棵 满二叉树 里面节点的数目&#xff0c;节点编号从 1 到 n 。根节点编号为 1 &#xff0c;树中每个非叶子节点 i 都有两个孩子&#xff0c;分别是左孩子…

java数据库操作-cnblog

创建lib目录&#xff0c;填入jar包 选择 libraries添加lib目录 package nb;import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException;public class JDBCtest {private static final String url "jdbc:mysql://localhost:3306/test?c…

SAP学习笔记 - 豆知识12 - 自动批量更新会计期间

网上买的那种SAP学习虚拟机&#xff0c;一般都是古老的会计期间。 要想更新到现在的日期&#xff0c;需要MMRV/MMPV挨月更新&#xff0c;感叹SAP挺会折磨人。 之前也做过多次探索&#xff0c;基本都没太成功。 SAP MM学习笔记 - 豆知识10 - OMSY 初期化会计期间&#xff0c;…

深入探索Spring Cloud Gateway:微服务网关的最佳实践

优质博文&#xff1a;IT-BLOG-CN Spring Cloud Gateway作为Spring Cloud框架的第二代网关&#xff0c;在功能上要比Zuul更加的强大&#xff0c;性能也更好。随着Spring Cloud的版本迭代&#xff0c;Spring Cloud官方有打算弃用Zuul的意思。在笔者调用了Spring Cloud Gateway的…

使用 Visual Studio Installer Projects 打包 C# WinForms 程序的教程

前言 在开发完成一个 C# WinForms 程序后&#xff0c;打包成安装程序是发布和分发软件的重要步骤之一。通过使用 Visual Studio Installer Projects&#xff0c; 可以轻松创建一个 .exe 或 .msi 格式的安装包供用户安装。本文将详细介绍如何使用 Visual Studio Installer Proj…

网络资源模板--Android Studio 实现简易记事本App

目录 一、项目演示 二、项目测试环境 三、项目详情 四、完整的项目源码 一、项目演示 网络资源模板--基于Android studio 实现的简易记事本App 二、项目测试环境 三、项目详情 首页 创建一个空的笔记本列表 mNotebookList。使用该列表和指定的布局资源 item_notebook 创建…

苹果最新论文:LLM只是复杂的模式匹配 而不是真正的逻辑推理

大语言模型真的可以推理吗&#xff1f;LLM 都是“参数匹配大师”&#xff1f;苹果研究员质疑 LLM 推理能力&#xff0c;称其“不堪一击”&#xff01;苹果的研究员 Mehrdad Farajtabar 等人最近发表了一篇论文&#xff0c;对大型语言模型 &#xff08;LLM&#xff09; 的推理能…

2.实现第一个three.js程序

实现第一个three.js程序 1.目标效果 注意一个版本问题&#xff1a;three.js版本并不稳定&#xff0c;几乎每个月都会更新一个小版本&#xff0c;尽可能使用固定版本进行开发&#xff0c;事实上我们入门的话&#xff0c;只掌握其中一个版本即可&#xff0c;如果使用新版本&…

文件与fd

访问文件前&#xff0c;为什么必须要打开文件&#xff1f;/ 打开文件的实质 访问文件前&#xff0c;都必须先打开它&#xff0c; 如fopen 访问文件时&#xff0c;是进程在访问 所以文件必须加载到内存中 我们要访问文件时&#xff0c;一定要通过内存访问 文件没有被打开时&am…

多线程(三):线程等待获取线程引用线程休眠线程状态

目录 1、等待一个线程&#xff1a;join 1.1 join() 1.2 join(long millis)——"超时时间" 1.3 join(long millis&#xff0c;int nanos) 2、获取当前线程的引用&#xff1a;currentThread 3、休眠当前进程&#xff1a;sleep 3.1 实际休眠时间 3.2 sleep的特殊…

SQLI LABS | SQLI LABS 靶场初识

关注这个靶场的其它相关笔记&#xff1a;SQLI LABS —— 靶场笔记合集-CSDN博客 0x01&#xff1a;SQLI LABS 靶场简介 SQLi-Labs 靶场是一个专门用于学习和测试 SQL 注入漏洞的开源靶场&#xff0c;该靶场提供了多个具有不同漏洞类型和难度级别的 Web 应用程序的环境。这些应用…

C++ | Leetcode C++题解之第477题汉明距离总和

题目&#xff1a; 题解&#xff1a; class Solution { public:int totalHammingDistance(vector<int> &nums) {int ans 0, n nums.size();for (int i 0; i < 30; i) {int c 0;for (int val : nums) {c (val >> i) & 1;}ans c * (n - c);}return …

matlab 相关

1、xcorr 本质上是两个函数做内积运算 相关算法有两种&#xff1a; 在Matlab上既可以 1.用自带的xcorr函数计算互相关&#xff0c;2.通过在频域上乘以共轭复频谱来计算互相关&#xff1b; 网友验证程序 clc;clear;close all; % s1,s2为样例数据 s1 [-0.00430297851562500;-…

[C++ 核心编程]笔记 4.1.2 struct和class的区别

4.1.2 struct和class的区别 在C中 struct和class唯一的区别就在于 默认的访问权限不同 区别: struct 默认权限为公共class 默认权限为私有 #include<iostream> using namespace std;class C1 {int m_A;//默认私有 }; struct C2 {int m_A;//默认共有 };int main() {//s…

【3dgs】Gaussian-SLAM发展关键历程梳理

【3dgs】Gaussian-SLAM 0. 写在前面1. 3D Splatting与SLAM流程2. Splatting SLAM&#xff1a;单目/RGB-D(2024年新作&#xff09;2.1 相机跟踪精度2.2 新视图渲染性能2.3 消融实验 3. Gaussian-SLAM&#xff08;Photo-SLAM&#xff09; Photo-SLAM技术原理详解 ORBSLAM3dGS&am…

超GPT3.5性能,无限长文本,超强RAG三件套,MiniCPM3-4B模型分享

MiniCPM3-4B是由面壁智能与清华大学自然语言处理实验室合作开发的一款高性能端侧AI模型&#xff0c;它是MiniCPM系列的第三代产品&#xff0c;具有4亿参数量。 MiniCPM3-4B模型在性能上超过了Phi-3.5-mini-Instruct和GPT-3.5-Turbo-0125&#xff0c;并且与多款70亿至90亿参数的…

CentOS快速配置网络Docker快速部署

CentOS快速配置网络&&Docker快速部署 CentOS裸机Docker部署1.联通外网2.配置CentOS镜像源3.安装Docker4.启动Docker5.CentOS7安装DockerCompose Bug合集ERROR [internal] load metadata for docker.io/library/java:8-alpineError: Could not find or load main class …

动力电池SOC估算方法

1. SOC介绍 电池的荷电状态SOC反映电池的剩余容量状况&#xff0c;即在一定的放电倍率下&#xff0c;当前电池的剩余容量与总容量的比值。 为了充分发挥电池性能和提高安全性&#xff0c;需要准确估算电池SOC。动力电池在使用过程中表现的高度非线性提高了SOC估算的难度&#…

(04)python-opencv图像处理——图像阈值、平滑图像、形态转换、图像梯度

目录 前言 一、图像阈值 1.1 简单的阈值法 1.2 自适应阈值 二、平滑图像 2.1 二维卷积(图像滤波) 2.2 图像模糊 2.2.1均值模糊 2.2.2高斯模糊 2.2.3 中值滤波 2.2.4 双边滤波 三、形态转换 1、腐蚀 2、膨胀 3、开运算 4、闭运算 四、图像梯度 Sobel 和 Scharr …