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

深入Spring Boot:自定义Starter开发与实践

引言

Spring Boot通过其强大的自动配置机制和丰富的Starter模块,极大地简化了Spring应用的开发过程。Starter模块封装了一组相关的依赖和配置,使得开发者可以通过简单的依赖引入,快速启用特定的功能。然而,除了使用Spring Boot提供的官方Starter模块,开发者还可以根据自己的需求开发自定义Starter,从而进一步扩展Spring Boot的功能。

本文将深入探讨Spring Boot自定义Starter的开发与实践。我们将从Starter的基本概念出发,逐步介绍自定义Starter的开发流程、核心原理以及最佳实践,并通过一个完整的示例项目展示如何开发和使用自定义Starter。

一、Spring Boot Starter基础

1.1 什么是Starter?

Starter是Spring Boot的核心组件之一,它是一种依赖管理机制,旨在简化Spring应用的开发过程。通过引入一个Starter模块,开发者可以快速启用Spring Boot提供的特定功能,而无需手动管理复杂的依赖和配置。

例如,spring-boot-starter-web是一个常用的Starter模块,它封装了Spring MVC和嵌入式Servlet容器(如Tomcat)的依赖,开发者只需在pom.xmlbuild.gradle中引入该模块,即可快速启动一个Web应用。

1.2 Starter的核心特性

  1. 依赖管理:Starter模块通过pom.xmlbuild.gradle文件管理一组相关的依赖,确保这些依赖的版本一致性和兼容性。

  2. 自动配置:Starter模块通常结合Spring Boot的自动配置机制,通过@EnableAutoConfiguration注解自动加载相关的配置类,从而实现“零配置”启动。

  3. 简化开发:通过封装常用的配置和依赖,Starter模块使得开发者可以更专注于业务逻辑的实现,而无需手动管理复杂的配置代码。

1.3 官方Starter模块

Spring Boot提供了大量的官方Starter模块,涵盖了Web开发、数据访问、消息队列、安全等多个领域。例如:

  • spring-boot-starter-web:支持Web开发,包括Spring MVC和嵌入式Servlet容器。

  • spring-boot-starter-data-jpa:支持JPA数据访问,包括Spring Data JPA和Hibernate。

  • spring-boot-starter-security:支持Spring Security,用于用户认证和授权。

  • spring-boot-starter-actuator:支持Spring Boot Actuator,用于监控应用的运行状态。

这些官方Starter模块为开发者提供了强大的功能支持,但它们并不能满足所有场景的需求。在某些情况下,开发者可能需要开发自定义Starter模块,以实现特定的功能或集成第三方库。

二、为什么需要自定义Starter?

尽管Spring Boot提供了丰富的官方Starter模块,但在实际开发中,开发者可能遇到以下场景,需要开发自定义Starter:

  1. 集成第三方库:当需要集成某个第三方库时,可以通过开发自定义Starter模块,封装该库的依赖和配置,使其更易于使用。

  2. 封装通用功能:在企业级开发中,项目之间可能存在一些通用的功能模块,如日志管理、配置管理等。通过开发自定义Starter模块,可以将这些通用功能封装起来,便于在多个项目中复用。

  3. 简化项目配置:通过自定义Starter模块,可以将复杂的配置逻辑封装起来,通过简单的配置文件或注解实现功能的启用和定制。

  4. 扩展Spring Boot功能:自定义Starter模块可以扩展Spring Boot的功能,使其支持更多的技术栈或框架。

开发自定义Starter模块不仅可以提升开发效率,还可以提高代码的可维护性和可扩展性。

三、开发自定义Starter的基本步骤

开发自定义Starter模块的核心目标是封装依赖和配置,使得开发者可以通过简单的依赖引入快速启用特定的功能。以下是开发自定义Starter的基本步骤:

3.1 创建Starter项目

开发自定义Starter模块的第一步是创建一个独立的项目。通常,Starter项目包含两个模块:

  1. 核心模块:封装核心功能和依赖。

  2. 自动配置模块:封装自动配置逻辑。

例如,我们创建一个名为my-spring-boot-starter的项目,包含以下结构:

复制

my-spring-boot-starter
├── my-spring-boot-starter-core
│   ├── src/main/java/com/example/core
│   └── src/main/resources
└── my-spring-boot-starter-autoconfigure├── src/main/java/com/example/autoconfigure└── src/main/resources

3.2 核心模块开发

核心模块是Starter模块的核心部分,它封装了功能实现和依赖。例如,如果我们要开发一个日志管理的Starter模块,核心模块可以包含日志管理的工具类和依赖。

3.2.1 定义功能接口

在核心模块中,定义一个功能接口,用于声明Starter模块提供的功能。例如:

java复制

package com.example.core;public interface MyService {void doSomething();
}
3.2.2 实现功能接口

实现上述接口,提供具体的功能实现。例如:

java复制

package com.example.core;public class MyServiceImpl implements MyService {@Overridepublic void doSomething() {System.out.println("MyService is doing something...");}
}
3.2.3 管理依赖

在核心模块的pom.xml文件中,管理相关的依赖。例如:

xml复制

<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></dependency>
</dependencies>

3.3 自动配置模块开发

自动配置模块是Starter模块的关键部分,它通过Spring Boot的自动配置机制,实现功能的自动加载和配置。

3.3.1 创建自动配置类

在自动配置模块中,创建一个自动配置类,通过@Conditional注解定义配置的加载条件。例如:

java复制

package com.example.autoconfigure;import com.example.core.MyService;
import com.example.core.MyServiceImpl;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@ConditionalOnClass(MyService.class)
public class MyAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic MyService myService() {return new MyServiceImpl();}
}

在上述代码中,@ConditionalOnClass注解确保只有当MyService类在类路径中时,才会加载该配置类;@ConditionalOnMissingBean注解确保只有当Spring容器中没有MyService的Bean时,才会创建一个默认的MyServiceImpl实例。

3.3.2 定义spring.factories文件

Spring Boot通过spring.factories文件加载自动配置类。在自动配置模块的resources目录下创建一个META-INF/spring.factories文件,并添加以下内容:

properties复制

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.autoconfigure.MyAutoConfiguration

这样,Spring Boot在启动时会自动加载MyAutoConfiguration类,并根据条件注解决定是否启用该配置。

3.3.3 管理依赖

在自动配置模块的pom.xml文件中,添加对核心模块的依赖。例如:

xml复制

<dependencies><dependency><groupId>com.example</groupId><artifactId>my-spring-boot-starter-core</artifactId><version>1.0.0</version></dependency>
</dependencies>

3.4 打包与发布

开发完成后,将Starter模块打包为jar文件,并发布到Maven仓库。这样,其他项目可以通过引入该Starter模块的依赖,快速启用其功能。

四、自定义Starter的核心原理

4.1 自动配置机制

Spring Boot的自动配置机制是自定义Starter的核心。通过@EnableAutoConfiguration注解,Spring Boot会自动扫描META-INF/spring.factories文件中定义的自动配置类,并根据条件注解决定是否启用这些配置。

条件注解是自动配置的关键,常用的条件注解包括:

  • @ConditionalOnClass:当指定的类在类路径中时,加载配置。

  • @ConditionalOnMissingClass:当指定的类不在类路径中时,加载配置。

  • @ConditionalOnBean:当Spring容器中存在指定的Bean时,加载配置。

  • @ConditionalOnMissingBean:当Spring容器中不存在指定的Bean时,加载配置。

  • @ConditionalOnProperty:当指定的配置属性满足条件时,加载配置。

通过这些条件注解,开发者可以灵活地控制配置的加载时机,从而实现“零配置”启动。

4.2 条件注解的使用

条件注解是自定义Starter的核心,通过合理使用条件注解,可以实现灵活的自动配置。

4.2.1 @ConditionalOnClass

@ConditionalOnClass注解用于判断指定的类是否在类路径中。如果指定的类存在,则加载配置。例如:

java复制

@Configuration
@ConditionalOnClass(MyService.class)
public class MyAutoConfiguration {// 配置内容
}

在上述代码中,只有当MyService类在类路径中时,才会加载MyAutoConfiguration类。

4.2.2 @ConditionalOnMissingBean

@ConditionalOnMissingBean注解用于判断Spring容器中是否已经存在指定的Bean。如果不存在,则创建一个默认的Bean。例如:

java复制

@Bean
@ConditionalOnMissingBean
public MyService myService() {return new MyServiceImpl();
}

在上述代码中,只有当Spring容器中没有MyService的Bean时,才会创建一个MyServiceImpl实例。

4.2.3 @ConditionalOnProperty

@ConditionalOnProperty注解用于判断配置文件中的属性是否满足条件。例如:

java复制

@Configuration
@ConditionalOnProperty(name = "my.service.enabled", havingValue = "true")
public class MyAutoConfiguration {// 配置内容
}

在上述代码中,只有当application.properties文件中定义了my.service.enabled=true时,才会加载MyAutoConfiguration类。

4.3 配置绑定

Spring Boot支持将配置文件中的属性绑定到Java对象中,从而实现配置的动态管理。

4.3.1 定义配置属性类

通过@ConfigurationProperties注解定义配置属性类,将配置文件中的属性绑定到Java对象中。例如:

java复制

package com.example.autoconfigure;import org.springframework.boot.context.properties.ConfigurationProperties;@ConfigurationProperties(prefix = "my.service")
public class MyServiceProperties {private boolean enabled;private String message;// 省略getter和setter方法
}

在上述代码中,my.service.enabledmy.service.message属性将被绑定到MyServiceProperties类的enabledmessage字段中。

4.3.2 使用配置属性

在自动配置类中,可以通过@EnableConfigurationProperties注解启用配置属性类。例如:

java复制

@Configuration
@EnableConfigurationProperties(MyServiceProperties.class)
public class MyAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic MyService myService(MyServiceProperties properties) {MyServiceImpl service = new MyServiceImpl();service.setMessage(properties.getMessage());return service;}
}

在上述代码中,MyServiceProperties类的属性将被注入到MyServiceImpl实例中。

4.4 自定义Starter的加载机制

Spring Boot通过spring.factories文件加载自定义Starter的自动配置类。在启动时,Spring Boot会扫描META-INF/spring.factories文件中定义的自动配置类,并根据条件注解决定是否启用这些配置。

例如,spring.factories文件的内容如下:

properties复制

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.autoconfigure.MyAutoConfiguration

在上述代码中,MyAutoConfiguration类将被加载并根据条件注解决定是否启用。

五、自定义Starter开发实践

5.1 示例项目:开发一个日志管理Starter

为了更好地理解自定义Starter的开发过程,我们通过一个具体的示例项目展示如何开发一个日志管理Starter模块。该Starter模块将封装日志管理的功能,包括日志记录和日志级别管理。

5.1.1 创建项目结构

创建一个名为log-spring-boot-starter的项目,包含以下结构:

复制

log-spring-boot-starter
├── log-spring-boot-starter-core
│   ├── src/main/java/com/example/log/core
│   └── src/main/resources
└── log-spring-boot-starter-autoconfigure├── src/main/java/com/example/log/autoconfigure└── src/main/resources
5.1.2 核心模块开发

在核心模块中,定义日志管理的功能接口和实现类。

定义功能接口

java复制

package com.example.log.core;public interface LogService {void log(String message);
}
实现功能接口

java复制

package com.example.log.core;public class LogServiceImpl implements LogService {@Overridepublic void log(String message) {System.out.println("Log: " + message);}
}
管理依赖

在核心模块的pom.xml文件中,管理相关的依赖。例如:

xml复制

<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></dependency>
</dependencies>
5.1.3 自动配置模块开发

在自动配置模块中,创建一个自动配置类,实现日志管理功能的自动配置。

创建自动配置类

java复制

package com.example.log.autoconfigure;import com.example.log.core.LogService;
import com.example.log.core.LogServiceImpl;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@ConditionalOnClass(LogService.class)
public class LogAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic LogService logService() {return new LogServiceImpl();}
}
定义spring.factories文件

在自动配置模块的resources目录下创建一个META-INF/spring.factories文件,并添加以下内容:

properties复制

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.log.autoconfigure.LogAutoConfiguration
管理依赖

在自动配置模块的pom.xml文件中,添加对核心模块的依赖。例如:

xml复制

<dependencies><dependency><groupId>com.example</groupId><artifactId>log-spring-boot-starter-core</artifactId><version>1.0.0</version></dependency>
</dependencies>
5.1.4 打包与发布

开发完成后,将Starter模块打包为jar文件,并发布到Maven仓库。这样,其他项目可以通过引入该Starter模块的依赖,快速启用日志管理功能。

5.2 示例项目:使用自定义Starter

为了验证自定义Starter的功能,我们创建一个Spring Boot项目,并引入上述日志管理Starter模块。

5.2.1 创建Spring Boot项目

通过Spring Initializr创建一个Spring Boot项目,选择spring-boot-starter-web依赖。

5.2.2 引入自定义Starter依赖

pom.xml文件中,引入日志管理Starter模块的依赖。例如:

xml复制

<dependency><groupId>com.example</groupId><artifactId>log-spring-boot-starter</artifactId><version>1.0.0</version>
</dependency>
5.2.3 使用日志管理功能

在Spring Boot项目中,注入LogService并使用其功能。例如:

java复制

package com.example.demo;import com.example.log.core.LogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class LogController {@Autowiredprivate LogService logService;@GetMapping("/log")public String logMessage() {logService.log("Hello, Log Service!");return "Message logged successfully.";}
}

运行项目并访问/log接口,可以看到控制台输出日志信息:

Log: Hello, Log Service!

通过上述示例,我们可以看到自定义Starter模块的开发和使用过程。开发者可以通过简单的依赖引入,快速启用日志管理功能,而无需手动管理复杂的配置代码。

六、自定义Starter的最佳实践

开发自定义Starter模块时,需要注意以下最佳实践,以确保Starter模块的可扩展性和易用性。

6.1 遵循Spring Boot的命名规范

Spring Boot的Starter模块通常以spring-boot-starter-<name>命名,例如spring-boot-starter-web。自定义Starter模块也应遵循这一命名规范,以便开发者能够快速识别其功能。

例如,如果开发一个日志管理的Starter模块,可以命名为log-spring-boot-starter

6.2 使用条件注解控制配置加载

通过合理使用条件注解,可以灵活地控制配置的加载时机,从而实现“零配置”启动。常用的条件注解包括@ConditionalOnClass@ConditionalOnMissingBean@ConditionalOnProperty等。

例如,通过@ConditionalOnClass注解可以判断指定的类是否在类路径中,从而决定是否加载配置。

6.3 提供默认配置和自定义配置

自定义Starter模块应提供默认配置,同时允许开发者通过配置文件或注解自定义配置。通过@ConfigurationProperties注解可以将配置文件中的属性绑定到Java对象中,从而实现配置的动态管理。

例如,可以通过定义MyServiceProperties类,将配置文件中的属性绑定到Java对象中。

6.4 提供清晰的文档和示例

自定义Starter模块的文档和示例是帮助开发者快速上手的关键。文档应包括Starter模块的功能介绍、依赖引入、配置方法和使用示例。

例如,可以通过Markdown格式编写文档,介绍如何引入依赖、配置属性和使用功能。

6.5 测试自定义Starter

开发自定义Starter模块时,需要进行充分的测试,以确保其功能正确性和兼容性。可以通过编写单元测试和集成测试,验证Starter模块的依赖管理、自动配置和功能实现。

例如,可以通过Spring Boot的测试支持模块spring-boot-starter-test编写测试用例,验证Starter模块的功能。

七、自定义Starter的高级特性

7.1 配置属性的动态刷新

Spring Boot支持配置属性的动态刷新,通过@RefreshScope注解可以实现配置的动态更新。

例如,可以通过定义@RefreshScope注解的Bean,实现配置属性的动态刷新。

java复制

@RefreshScope
@Bean
public MyService myService(MyServiceProperties properties) {MyServiceImpl service = new MyServiceImpl();service.setMessage(properties.getMessage());return service;
}

在上述代码中,当配置文件中的my.service.message属性发生变化时,MyServiceImpl实例的message字段将自动更新。

7.2 提供自定义注解

自定义Starter模块可以通过提供自定义注解,简化配置和功能启用。

例如,可以通过定义@EnableMyService注解,启用日志管理功能。

java复制

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(MyAutoConfiguration.class)
public @interface EnableMyService {
}

在上述代码中,@EnableMyService注解通过@Import注解导入MyAutoConfiguration类,从而启用日志管理功能。

7.3 集成第三方库

自定义Starter模块可以封装第三方库的依赖和配置,使其更易于使用。

例如,可以通过定义@ConditionalOnClass注解,判断第三方库的类是否在类路径中,从而决定是否加载配置。

java复制

@Configuration
@ConditionalOnClass(LogService.class)
public class LogAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic LogService logService() {return new LogServiceImpl();}
}

在上述代码中,只有当第三方库的LogService类在类路径中时,才会加载LogAutoConfiguration类。

八、总结

自定义Starter模块是Spring Boot扩展功能的重要方式之一。通过开发自定义Starter模块,开发者可以封装依赖和配置,简化项目开发过程,提升开发效率。

本文从Starter的基本概念出发,详细介绍了自定义Starter的开发流程、核心原理以及最佳实践,并通过一个完整的示例项目展示了如何开发和使用自定义Starter模块。希望本文对您在Spring Boot项目中开发自定义Starter有所帮助。

在实际开发中,开发者可以根据项目需求和个人偏好选择合适的开发方式。无论开发何种类型的Starter模块,都应遵循Spring Boot的设计理念,提供简洁、易用且功能强大的模块,帮助开发者更高效地构建Spring Boot应用。

相关文章:

深入Spring Boot:自定义Starter开发与实践

引言 Spring Boot通过其强大的自动配置机制和丰富的Starter模块&#xff0c;极大地简化了Spring应用的开发过程。Starter模块封装了一组相关的依赖和配置&#xff0c;使得开发者可以通过简单的依赖引入&#xff0c;快速启用特定的功能。然而&#xff0c;除了使用Spring Boot提…...

React 中hooks之useTransition使用总结

目录 概述基本用法使用场景最佳实践注意事项 概述 什么是 useTransition? useTransition 是 React 18 引入的新 Hook&#xff0c;用于标记非紧急的状态更新。它允许组件在状态转换期间保持响应&#xff0c;通过将某些更新标记为"过渡"来推迟它们的渲染。 主要特…...

怎样使用树莓派自己搭建一套ADS-B信号接收系统

0 我们知道&#xff0c;ADS-B全称广播式自动相关监视系统&#xff0c;其实就是飞机发出的广播信号&#xff0c;用明码来对外发送自己的位置、高度、速度、航向等信息&#xff0c;是公开信息。连续接收到一架飞机发出的ADS-B信息后&#xff0c;可以通过其坐标点来描绘出飞机的航…...

Chrome谷歌浏览器如何能恢复到之前的旧版本

升级了谷歌最新版不习惯&#xff0c;如何降级版本 未完待续。。 电脑中的Chrome谷歌浏览器升级到了最新版本&#xff0c;但是有种种的不适应&#xff0c;如何能恢复到之前的旧版本呢&#xff1f;我们来看看操作步骤&#xff0c;而且无需卸载重装。 怎么恢复Chrome 之前版本&a…...

路由器旁挂三层网络实现SDWAN互联(爱快SD-WAN)

近期因公司新办公区建设&#xff0c;原有的爱快路由器的SDWAN功能实现分支之间互联的服务还需要继续使用。在原有的小型网络中&#xff0c;使用的爱快路由器当作网关设备&#xff0c;所以使用较为简单,如下图所示。 现变更网络拓扑为三层网络架构&#xff0c;但原有的SDWAN分支…...

代码随想录算法训练营第五十五天 |108.冗余连接 109.冗余连接Ⅱ

108.冗余连接&#xff1a; 文章链接 题目链接&#xff1a;108.冗余连接 思路 首先分析题目&#xff0c;给定拥有n个节点和n条边的图&#xff0c;其中图是在原n个节点和n - 1条无环无向图中添加一条边得到的。要求是输出多出的边。&#xff08;PS&#xff1a;可能会有多个答案…...

Unity补充 -- 协程相关

1.协程。 协程并不是线程。线程是主线程之外的另一条 代码按照逻辑执行通道。协程则是在代码在按照逻辑执行的同时&#xff0c;是否需要执行额外的语句块。 2.协程的作用。 在update执行的时候&#xff0c;是按照帧来进行刷新的&#xff0c;也是按照帧执行代码的。但是又不想…...

【第二十周】U-Net:用于生物图像分割的卷积神经网络

文章目录 摘要Abstract文章信息研究动机U-Net网络结构U-Net网络搭建数据增强损失函数转置卷积创新性与不足创新性&#xff1a;不足&#xff1a; 总结 摘要 U-Net&#xff08;Convolutional Networks for Biomedical Image Segmentation&#xff09;是一种用于图像分割的深度学…...

部署Metricbeat监测ES

官方参考文档 安装Metricbeat curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.17.27-linux-x86_64.tar.gztar xzvf metricbeat-7.17.27-linux-x86_64.tar.gz设置 Metricbeat连接到 Elasticsearch 进入metricbeat目录配置metricbeat.yml …...

Pytorch|YOLO

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、 前期准备 1. 设置GPU 如果设备上支持GPU就使用GPU,否则使用CPU import torch import torch.nn as nn import torchvision.transforms as transforms im…...

云计算与物联网技术的融合应用(在工业、农业、家居、医疗、环境、城市等整理较全)

摘要 为生产领域带来更加全面和深入的变革。通过云计算平台对物联网数据进行处理和分析&#xff0c;企业可以实现对生产过程的更加精细化的管理和控制。 1. 智能生产调度 通过云计算和物联网技术的融合应用&#xff0c;企业可以实现对生产线上各个环节的实时监控和数据分析。…...

基于python+Django+mysql鲜花水果销售商城网站系统设计与实现

博主介绍&#xff1a;黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者&#xff0c;CSDN博客专家&#xff0c;在线教育专家&#xff0c;CSDN钻石讲师&#xff1b;专注大学生毕业设计教育、辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…...

Golang:报错no required module provides package github.com/xx的解决方法

报错 问题重现可能的原因及解决方法1. 未初始化 Go 模块解决方法&#xff1a; 2. 没有添加依赖解决方法&#xff1a; 3. 网络问题解决方法&#xff1a; 4. 依赖版本问题解决方法&#xff1a; 5. 包未发布或路径拼写错误解决方法&#xff1a; 6. go mod tidy 未运行解决方法&…...

数据结构与算法(2):顺序表与链表

1.前言 哈喽大家好喔&#xff0c;今天博主继续进行数据结构的分享与学习&#xff0c;今天的主要内容是顺序表与链表&#xff0c;是最简单但又相当重要的数据结构&#xff0c;为以后的学习有重要的铺垫&#xff0c;希望大家一起交流学习&#xff0c;互相进步&#xff0c;让我们…...

华为OD机试E卷 --过滤组合字符串--24年OD统一考试(Java JS Python C C++)

文章目录 题目描述输入描述输出描述用例题目解析JS算法源码Java算法源码python算法源码c算法源码c++算法源码题目描述 数字 0、1、2、3、4、5、6、7、8、9 分别关联 a~z 26 个英文字母。 0 关联“a”"b”"c1 关联“d”"e”"f2 关联“g"“h”“i”3 关…...

QT跨平台应用程序开发框架(3)—— 信号和槽

目录 一&#xff0c;基本概念 二&#xff0c;connect函数使用 2.1 connect 2.2 Qt内置信号和槽 2.3 一些细节 三&#xff0c;自定义信号和槽 3.1 自定义槽函数 3.2 自定义信号 3.3 带参数的信号槽 四&#xff0c;信号和槽的意义 五&#xff0c;信号和槽断开连接 六&…...

从 0 开始实现一个 SpringBoot + Vue 项目

从 0 开始实现一个 SpringBoot Vue 项目 从 0 开始实现一个 SpringBoot Vue 项目 软件和工具创建 SpringBoot 后端项目创建 MySQL 数据库配置文件实现增删改查接口 Model 层mapper 层service 层controller 层测试 实现项目功能接口 代码测试 创建 Vue 前端 安装 Node.js配置…...

【无标题】微调是迁移学习吗?

是的&#xff0c;微调&#xff08;Fine-Tuning&#xff09;可以被视为一种迁移学习&#xff08;Transfer Learning&#xff09;的形式。迁移学习是一种机器学习方法&#xff0c;其核心思想是利用在一个任务上学到的知识来改进另一个相关任务的性能。微调正是通过在预训练模型的…...

虚幻基础1:hello world

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 hello world创建项目创建关卡创建蓝图将蓝图插入关卡中运行 hello world 本文引擎为5.5.1 创建项目 如图 创建后如图。 创建关卡 如图 创建蓝图 如图 选择actor 双击进入蓝图节点 选择事件图表 创…...

C链表的一些基础知识

一、链表的基本概念 链表是一种常见的线性数据结构&#xff0c;它由一系列节点组成&#xff0c;每个节点包含数据部分和指向下一个节点的指针&#xff08;单链表情况&#xff09;。通过指针将各个节点连接起来&#xff0c;与数组不同&#xff0c;链表在内存中的存储不是连续的…...

Web前端基础:JavaScript

1.JS核心语法 1.1 JS引入方式 第一种方式&#xff1a;内部脚本&#xff0c;将JS代码定义在HTML页面中 JavaScript代码必须位于<script></script>标签之间在HTML文档中&#xff0c;可以在任意地方&#xff0c;放置任意数量的<script></script>一般会把…...

智能标志桩图像监测装置如何守护地下电缆安全

在现代城市基础设施建设中&#xff0c;大量电缆、管道被埋设于地下&#xff0c;这虽然美化了城市景观&#xff0c;却也带来了新的安全隐患。施工挖掘时的意外破坏、自然灾害的影响&#xff0c;都可能威胁这些"城市血管"的安全运行。 传统的地下设施标识方式往往只依…...

【产品业务设计】支付业务设计规范细节记录,含订单记录、支付业务记录、支付流水记录、退款业务记录

【产品业务设计】支付业务设计规范细节记录&#xff0c;含订单记录、支付业务记录、支付流水记录 前言 我为什么要写这个篇文章 总结设计经验生成设计模板方便后期快速搭建 一个几张表 一共5张表&#xff1b; 分别是&#xff1a; 订单主表&#xff1a;jjy_orderMain订单产…...

手拉手处理RuoYi脚手架常见文问题

若依前后端分离版开发入门 基础环境&#xff1a;JDK1.8mysqlRedisMavenVue 取消登录验证码 后端 修改ruoyi-ui项目中的login.vue 在ruoyi-ui项目>src>views中找到login.vue文件 1、注释验证码展示及录入部分 2、 注释code必填校验&#xff0c;默认验证码开关为false …...

tensorflow image_dataset_from_directory 训练数据集构建

以数据集 https://www.kaggle.com/datasets/vipoooool/new-plant-diseases-dataset 为例 目录结构 训练图像数据集要求&#xff1a; 主目录下包含多个子目录&#xff0c;每个子目录代表一个类别。每个子目录中存储属于该类别的图像文件。 例如 main_directory/ ...cat/ ...…...

声音信号的基频检测(python版本)

import math import wave import array import functools from abc import ABC, abstractmethod import matplotlib import matplotlib.pyplot as plt from matplotlib.gridspec import GridSpec import os import sys# 设计模式部分 class PreprocessStrategy(ABC):"&q…...

centos7.9源码安装zabbix7.12,求赞

centos7.9源码安装zabbix7.12-全网独有 3.CentOS7_Zabbix7.0LTS3.1.安装环境3.2.换成阿里源3.3.安装相关依赖包3.3.1.直接安装依赖3.3.2.编译安装-遇到问题01-net-snmp3.3.3.编译安装-遇到问题02-libevent3.3.4.编译安装-遇到问题03-安装openssl 3.4.创建用户和组3.5.下载上传源…...

Docker 容器化基础:镜像、容器与仓库的本质解析

Docker 概念与容器化技术 Docker 是一种容器化平台&#xff0c;能够将应用程序及其依赖项打包成一个容器&#xff0c;确保在任何环境中都能一致运行。容器化技术通过操作系统级别的虚拟化&#xff0c;为应用程序提供了一个独立的运行环境。 容器化技术的核心优势 一致性&…...

vue+elementUI+springboot实现文件合并前端展示文件类型

项目场景&#xff1a; element的table上传文件并渲染出文件名称点击所属行可以查看文件,并且可以导出合并文件,此文章是记录合并文档前端展示的帖子 解决方案&#xff1a; 后端定义三个工具类 分别是pdf,doc和word的excle的目前我没整 word的工具类 package com.sc.modules…...

BugKu Web渗透之需要管理员

启动场景&#xff0c;打开网页&#xff0c;显示如下&#xff1a; 一般没有上面头绪的时候&#xff0c;就是两步&#xff1a;右键查看源代码 和 扫描网站目录。 步骤一&#xff1a; 右键查看源代码 和 扫描网站目录。 右键查看源代码没有发现异常。 于是扫描网站目录&…...