与鸿蒙同行,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:: | ||
- config | config.add | ||
| 应用属性 | solon:: | ||
- solon.config | solon.config.add |
- 弃用
| 类型 | 弃用配置名 | 替代配置名 | |
|---|---|---|---|
| 应用属性 | solon-boot:: | ||
- server.session.state.domain | server.session.cookieDomain | ||
- server.session.state.domain.auto | server.session.cookieDomainAuto | ||
| solon-web-staticfiles:: | |||
- solon.staticfiles.maxAge | solon.staticfiles.cacheMaxAge |
3、弃用事件移除对应表(要认真检查)
| 插件 | 移除事件 | 替代方案 | |
|---|---|---|---|
| solon | @Bean bean? | getBeanAsync(…class, …) / @Inject .. | |
@Component bean? | getBeanAsync(…class, …) / @Inject .. | ||
| solon-serialization-fastjson | FastjsonActionExecutor | getBeanAsync(…class, …) / @Inject .. | |
| FastjsonRenderFactory | getBeanAsync(…class, …) / @Inject .. | ||
| solon-serialization-fastjson2 | Fastjson2ActionExecutor | getBeanAsync(…class, …) / @Inject .. | |
| Fastjson2RenderFactory | getBeanAsync(…class, …) / @Inject .. | ||
| solon-serialization-fury | FuryActionExecutor | getBeanAsync(…class, …) / @Inject .. | |
| solon-serialization-gson | GsonActionExecutor | getBeanAsync(…class, …) / @Inject .. | |
| GsonRenderFactory | getBeanAsync(…class, …) / @Inject .. | ||
| solon-serialization-hessian | HessianActionExecutor | getBeanAsync(…class, …) / @Inject .. | |
| solon-serialization-jackson | JacksonActionExecutor | getBeanAsync(…class, …) / @Inject .. | |
| JacksonRenderFactory | getBeanAsync(…class, …) / @Inject .. | ||
| solon-serialization-jackson-xml | JacksonXmlActionExecutor | getBeanAsync(…class, …) / @Inject .. | |
| JacksonXmlRenderFactory | getBeanAsync(…class, …) / @Inject .. | ||
| solon-serialization-properties | PropertiesActionExecutor | getBeanAsync(…class, …) / @Inject .. | |
| PropertiesRenderFactory | getBeanAsync(…class, …) / @Inject .. | ||
| solon-serialization-protostuff | ProtostuffActionExecutor | getBeanAsync(…class, …) / @Inject .. | |
| solon-serialization-snack3 | SnackActionExecutor | getBeanAsync(…class, …) / @Inject .. | |
| SnackRenderFactory | getBeanAsync(…class, …) / @Inject .. | ||
| solon-view-beetl | GroupTemplate | getBeanAsync(BeetlRender.class, …) / @Inject .. | |
| solon-view-enjoy | Engine | getBeanAsync(EnjoyRender.class, …) / @Inject .. | |
| solon-view-freemarker | Configuration | getBeanAsync(FreemarkerRender.class, …) / @Inject .. | |
| solon-view-thymeleaf | TemplateEngine | getBeanAsync(ThymeleafRender.class, …) / @Inject .. | |
| solon-view-velocity | RuntimeInstance | getBeanAsync(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.由扫描时自动注入@Beanpublic 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 | ||
| NdMap | IgnoreCaseMap<Object> | ||
| solon-data | |||
| Serializer | core::Serializer | ||
| solon-data-dynamicds | |||
| DynamicDsHolder | DynamicDsKey | ||
| solon-logging | |||
| LogUtilToSlf4j | / | ||
| solon-logging-log4j | |||
| SolonCloudAppender | / | ||
| solon-logging-logback | |||
| SolonCloudAppender | / | ||
| solon-serialization | |||
| JsonConverter | core::Converter | ||
| StringSerializer | core::Serializer<String> | ||
| solon-test | |||
@TestPropertySource | @Import | ||
@TestRollback | @Rollback | ||
| AbstractHttpTester | HttpTester | ||
| HttpTestBase | HttpTester |
6、弃用接口方法移除对应表(编译会有提醒)
| 调整类 | 移除方法(或字段) | 替代方法 | |
|---|---|---|---|
| nami:: | |||
| - Constants | CONTENT_TYPE_* | ||
| solon:: | |||
| - ActionParamResolver | resolvePathVar() | ||
| - ActionDefault | before(.) | / 只留 filter 体系 | |
| after(.) | / | ||
| - AppContext | beanOnloaded(.) | lifecycle(.) | |
| - Bean | registered() | delivered() | |
| - BeanContainer | getAttrs() | attachment*(.) | |
beanAround*(.) | beanInterceptor*(.) | ||
| - ClassUtil | newInstance(.) | tryInstance(.) | |
| - ClassWrap | getFieldAllWraps() | getFieldWraps() | |
| - Component | registered() | delivered() | |
| - ConditionUtil | ifMissing(.) | ifMissingBean(.) | |
| - Context | ip() | 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() | ||
| - DateAnalyzer | getGlobal() | global() | |
| - EventBus | pushAsync() | publishAsync() | |
| pushTry() | publishTry() | ||
| push() | publish() | ||
| - Gateway | before(.) | / 只留 filter 体系 | |
| after(.) | / | ||
| - LifecycleBean | prestop() | preStop() | |
| - LogUtil | debugAsync() | / | |
| infoAsync() | / | ||
| - MethodHolder | getArounds() | getInterceptors() | |
| - MethodWrap | getArounds() | getInterceptors() | |
| - MvcFactory | resolveParam(.) | resolveActionParam(.) | |
| - NvMap | (map) | from(map) | |
| getBean(.) | toBean(.) | ||
| - Props | getByParse(.) | getByTmpl(.) | |
| getXmap(.) | getMap(.) | ||
| getBean(.) | toBean(.) | ||
| - RenderManager | mapping(.) | Solon.app().render(key, ) | |
| register(.) | Solon.app().render(null, .) | ||
| - ResourceUtil | remClasspath(.) | remSchema(.) | |
| - Router | matchOne(.) | matchMain(.) | |
| - RunUtil | setExecutor(.) | setParallelExecutor(.) | |
| - SolonApp | before(.) | / 只留 filter 体系 | |
| after(.) | / | ||
| - SolonProps | source() | app.source() | |
| sourceLocation() | app.sourceLocation() | ||
| - Utils | TAG_classpath | / | |
| resolvePaths(.) | / | ||
| hasClass(.) | ClassUtil.hasClass(.) | ||
| loadClass(.) | ClassUtil.loadClass(.) | ||
| newInstance(.) | ClassUtil.tryInstance(.) | ||
getResource*(.) | ResourceUtil.getResource*(.) | ||
transferTo*(.) | IoUtil.transferTo*(.) | ||
| buildExt(.) | getFolderAndMake(.) | ||
| solon-boot:: | |||
| - HttpServerConfigure | allowSsl(.) | enableSsl(.) | |
| solon-data:: | |||
| - CacheService | get(key) | get(key, type) | |
| solon-scheduling:: | |||
| - IJobManager | setJobInterceptor(.) | addJobInterceptor(.) | |
| solon-serialization-properties:: | |||
| - PropertiesActionExecutor | includeFormUrlencoded(.) | allowPostForm(.) |
7、弃用插件移除对应表
其中简化了快捷组合包(发现太多,容易混乱),只留两个基础的:
- solon-lib(保持不变)
- solon-web(移除了 solon-view-freemarker)
| 移除插件 | 替代插件 | 备注 |
|---|---|---|
| :: cloud | ||
| solon.cloud.httputils | solon-net-httputils | |
| :: detector | ||
| detector-solon-plugin | solon-health-detector | |
| :: logging | ||
| log4j2-solon-plugin | solon-logging-log4j2 | |
| logback-solon-plugin | solon-logging-logback | |
| :: scheduling | ||
| solon.extend.schedule | / | |
| :: testing | ||
| solon.test | solon-test | |
| :: web | ||
| solon.web.flux | solon-web-rx | |
| :: shortcuts | ||
| solon-api | solon-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-hutool | nami.channel.http.hutool | |
| nami-channel-http-okhttp | nami.channel.http.okhttp | |
| nami-channel-socketd | nami.channel.socketd | |
| nami-coder-fastjson | nami.coder.fastjson | |
| nami-coder-fastjson2 | nami.coder.fastjson2 | |
| nami-coder-fury | nami.coder.fury | |
| nami-coder-hessian | nami.coder.hessian | |
| nami-coder-jackson | nami.coder.jackson | |
| nami-coder-protostuff | nami.coder.protostuff | |
| nami-coder-snack3 | nami.coder.snack3 | |
| :: base | ||
| solon-config-banner | solon.banner | |
| solon-config-yaml | solon.config.yaml | |
| solon-config-plus | 从原 solon.config.yaml 里拆出来 | |
| solon-hotplug | solon.hotplug | |
| solon-i18n | solon.i18n | |
| solon-mvc | solon.mvc | |
| solon-proxy | solon.proxy | |
| solon-rx | 新增 | |
| :: boot | ||
| solon-boot-jdkhttp | solon.boot.jdkhttp | |
| solon-boot-jetty-add-jsp | solon.boot.jetty.add.jsp | |
| solon-boot-jetty-add-websocket | solon.boot.jetty.add.websocket | |
| solon-boot-jetty | solon.boot.jetty | |
| solon-boot-jlhttp | solon.boot.jlhttp | |
| solon-boot-smarthttp | solon.boot.smarthttp | |
| solon-boot-socketd | solon.boot.socketd | |
| solon-boot-undertow-add-jsp | solon.boot.undertow.add.jsp | |
| solon-boot-undertow | solon.boot.undertow | |
| solon-boot-vertx | solon.boot.vertx | |
| solon-boot-websocket-netty | solon.boot.websocket.netty | |
| solon-boot-websocket | solon.boot.websocket | |
| solon-boot | solon.boot | |
| :: cloud | ||
| solon-cloud-eventplus | solon.cloud.eventplus | |
| solon-cloud-gateway | solon.cloud.gateway | |
| solon-cloud-metrics | solon.cloud.metrics | |
| solon-cloud-tracing | solon.cloud.tracing | |
| solon-cloud | solon.cloud | |
| :: data | ||
| solon-cache-caffeine | solon.cache.caffeine | |
| solon-cache-jedis | solon.cache.jedis | |
| solon-cache-redisson | solon.cache.redisson | |
| solon-cache-spymemcached | solon.cache.spymemcached | |
| solon-data-dynamicds | solon.data.dynamicds | |
| solon-data-shardingds | solon.data.shardingds | |
| solon-data | solon.data | |
| :: detector | ||
| solon-health-detector | solon.health.detector | |
| solon-health | solon.health | |
| :: docs | ||
| solon-docs-openapi2 | solon.docs.openapi2 | |
| solon-docs-openapi3 | ||
| solon-docs | solon.docs | |
| :: faas | ||
| solon-faas-luffy | solon.luffy | |
| :: logging | ||
| solon-logging-log4j2 | solon.logging.log4j2 | |
| solon-logging-logback | solon.logging.logback | |
| solon-logging-simple | solon.logging.simple | |
| solon-logging | solon.logging | |
| :: native | ||
| solon-aot | solon.aot | |
| ::net | ||
| solon-net-httputils | solon.net.httputils | |
| solon-net-stomp | ||
| solon-net | solon.net | |
| :: scheduling | ||
| solon-scheduling-quartz | solon.scheduling.quartz | |
| solon-scheduling-simple | solon.scheduling.simple | |
| solon-scheduling | solon.scheduling | |
| :: security | ||
| solon-security-auth | solon.auth | 旧名弃用 |
| solon-security-validation | solon.validation | 旧名弃用 |
| solon-security-vault | solon.vault | 旧名弃用 |
| solon-security-auth | solon.security.auth | |
| solon-security-validation | solon.security.validation | |
| solon-security-vault | solon.security.vault | |
| :: serialization | ||
| solon-serialization | solon.serialization | |
| solon-serialization-fastjson | solon.serialization.fastjson | |
| solon-serialization-fastjson2 | solon.serialization.fastjson2 | |
| solon-serialization-fury | solon.serialization.fury | |
| solon-serialization-gson | solon.serialization.gson | |
| solon-serialization-hessian | solon.serialization.hessian | |
| solon-serialization-jackson | solon.serialization.jackson | |
| solon-serialization-jackson-xml | solon.serialization.jackson.xml | |
| solon-serialization-kryo | 略过(未发布) | |
| solon-serialization-properties | solon.serialization.properties | |
| solon-serialization-protostuff | solon.serialization.protostuff | |
| solon-serialization-snack3 | solon.serialization.snack3 | |
| :: view | ||
| solon-view | solon.view | |
| solon-view-beetl | solon.view.beetl | |
| solon-view-enjoy | solon.view.enjoy | |
| solon-view-freemarker | solon.view.freemarker | |
| solon-view-jsp | solon.view.jsp | |
| solon-view-jsp-jakarta | 略过(未发布) | |
| solon-view-thymeleaf | solon.view.thymeleaf | |
| solon-view-velocity | solon.view.velocity | |
| :: web | ||
| solon-sessionstate-jedis | solon.sessionstate.jedis | |
| solon-sessionstate-jwt | solon.sessionstate.jwt | |
| solon-sessionstate-local | solon.sessionstate.local | |
| solon-sessionstate-redisson | solon.sessionstate.redisson | |
| solon-web-cors | solon.web.cors | |
| solon-web-rx | solon.web.rx | |
| solon-web-sdl | solon.web.sdl | |
| solon-web-servlet | solon.web.servlet | |
| solon-web-servlet-jakarta | solon.web.servlet.jakarta | |
| solon-web-sse | solon.web.sse | |
| solon-web-staticfiles | solon.web.staticfiles | |
| solon-web-stop | solon.web.stop | |
| solon-web-webdav | solon.web.webdav |
相关文章:
与鸿蒙同行,Java Solon v3.0 正式发布(向下兼容)
与 HarmonyOS NEXT 10月8日公测同行。Solon (开放原子开源基金会,孵化项目) v3.0 正式发布, 且将在 2025 年启动华为编程语言 “仓颉” 版开发(届时会有 Solon-Java 和 Solon-CJ 两大版本)。本次大版本更新…...
数据驱动投资:AI在股票市场的应用
当ChatGPT首次亮相时,其卓越的语言处理能力立刻引起了许多行业的广泛关注,投资界也不例外。关于ChatGPT是否能应用于投资决策的问题,迅速成为热门讨论的焦点。 近期,加拿大多伦多大学和印度孟买理工学院的研究人员联合开展了一项…...
Tita使用小技巧:项目类型自定义,业务管理个性化
应用场景 某互联网企业,企业内部有研发部,有销售部 研发部通常需要管理各种技术研发类型项目,因此需要管理「研发型」项目,该类型项目需要明确「所属产品」、「级别管理:国家级/省市级」、「项目类别:创新…...
国药准字:您购药的可靠指南
益安宁丸为同溢堂药业有限公司所独家生产的一款中成药,在内地市场和港澳地区均有上市。 益安宁丸真品的唯一标准:无论港版还是内地版,包装盒必然有国药准字Z20063087标识,但凡没有国药准字标识的必为假药。...
Python类学习(2)——未完待续
函数和类的参数传递 实例方法 class House:# 类构造方法,也是实例方法def __init__(self, area, price):self.area areaself.price pricedef cls_func(self, arg):print(arg)my_house House(America, 330) # 实例化类对象,需要传入init中的两个参数 print(f…...
微前端框架 qiankun 全面解析到源码实现
微前端(Micro Frontends)是一种将大型前端应用拆分为多个独立模块的架构设计思想,旨在解决复杂应用开发与维护的难题。qiankun 是目前流行的微前端解决方案之一,基于 single-spa 进行封装,提供了一种简单且完整的微前端…...
初始化数据的正确方式?
关于这篇文章 https://proandroiddev.com/loading-initial-data-in-launchedeffect-vs-viewmodel-f1747c20ce62 pl的视频解读 当在viewmodel中需要进行数据的初始化的时候 viewmodel.initData() 放在哪里合适呢,大部分情况下可以放在 viewmodel的init{}模块&…...
Flutter平台嵌入器
When you build a Flutter app, it’s not just about the code you write in Dart and the Flutter framework. There’s also a crucial piece called the platform embedders that enable your Flutter app to run on different operating systems like Android, iOS, and s…...
微信小程序——婚礼邀请函
一、界面设计 首页: 精美的婚礼主题背景图,可能是新人的婚纱照或浪漫的插画。温馨的欢迎语,如 “欢迎参加我们的婚礼”。一个 “打开邀请函” 的按钮,引导用户进入邀请函详情页面。 邀请函详情页面: 顶部展示新人的照片…...
WebRTC Connection Negotiate解决
最近有个项目 ,部署之后一直显示,查了一些资料还是没有解决,无奈只有自己研究解决?经过排查,应该是内网穿透的问题 什么是内网穿透? 我们访问我们自己的官网产品页面,我们的服务器是一个单独…...
Redis面试篇1
1、为什么要用缓存? 使用缓存的目的就是提升读写性能。在实际的业务场景下,更多的是为了提升读性能,带来更好的性能和并发量。Redis的读写性能比MySQL好的多,我们就可以把MySQL中的热点数据缓存到Redis,提升读取性能&…...
Debezium系列之:Debezium 3.0.0.Final发布
Debezium系列之:Debezium 3.0.0.Final发布 Debezium 核心的变化需要 Java 17基于Kafka 3.8 构建废弃的增量信号字段的删除每个表的详细指标MariaDB连接器的更改版本 11.4.3 支持MongoDB连接器的更改MongoDB sink connectorMySQL连接器的改变MySQL 9MySQL向量数据类型Oracle连接…...
一文解决jQuery表格插件DataTable导出PDF中文乱码问题
原因是默认字体不支持中文,需要更换字体。 详情官网:pdfmake 官网的大致意思是,下载pdfmake后,自行生成可用的字体js文件 以下是详细操作: 重要前提:电脑上需要已安装nodejs 点击进入官网下载安装即可&a…...
使用pytorch进行迁移学习的两个步骤
1. 步骤及代码 迁移学习一般都会使用两个步骤进行训练: 固定预训练模型的特征提取部分,只对最后一层进行训练,使其快速收敛;使用较小的学习率,对全部模型进行训练,并对每层的权重进行细微的调节。 impor…...
ChatGPT相关参数示例
max_token 用于控制最大输出长度,若ChatGPT的回复大于max_tokens,则对输出结果进行截断。 from openai import OpenAI client OpenAI(base_url"https://api.chatanywhere.tech/v1" ) response client.chat.completions.create(model"…...
OWASP发布大模型安全风险与应对策略(QA测试重点关注)
开放式 Web 应用程序安全项目(OWASP)发布了关于大模型应用的安全风险,这些风险不仅包括传统的沙盒逃逸、代码执行和鉴权不当等安全风险,还涉及提示注入、对话数据泄露和数据投毒等人工智能特有的安全风险。 帮助开发者和测试同学更…...
【HarmonyOS开发笔记 2 】 -- ArkTS语法中的变量与常量
ArkTS是HarmonyOS开发的编程语言 ArkTS语法中的变量 【语法格式】: let 变量名: 类型 值 let:是定义变量的关键字类型: 值数据类型, 常用的数据类型 字符型(string)、数字型(number…...
UI自动化测试示例:python+pytest+selenium+allure
重点应用是封装、参数化: 比如在lib文件夹下,要存储封装好的方法和必要的环境变量(指网址等) 1.cfg.py:封装网址和对应的页面 SMP_ADDRESS http://127.0.0.1:8234SMP_URL_LOGIN f{SMP_ADDRESS}/login.html SMP_URL_DE…...
C/C++ 编程小工具
编写了 tools.h 和 tools.cpp,用于 Debug、性能测试、打印日志。 tools.h #ifndef TOOLS_H #define TOOLS_H#include <time.h> #include <fstream> #include <iostream> #include <random> #include <chrono> #include <vector&…...
第四十二章 使用 WS-ReliableMessaging
文章目录 第四十二章 使用 WS-ReliableMessaging从 Web 客户端发送一系列消息 第四十二章 使用 WS-ReliableMessaging IRIS 支持 WS-ReliableMessaging 规范的部分内容,如简介中所述。此规范提供了一种按顺序可靠地传递一系列消息的机制。本页介绍如何手动使用可靠…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...
