【构建企业级Spring Boot应用:从基础到高级的全面指南】
摘要
本文旨在为开发者提供一份详尽的指南,帮助大家深入理解并掌握如何使用Spring Boot框架来快速开发企业级应用程序。通过实际案例分析、代码示例以及架构设计思路分享,读者不仅能够学习到理论知识,还能获得宝贵的实践经验。本文将涵盖从环境搭建、项目创建、配置管理、数据访问层、Web服务开发、安全机制实现、日志记录、单元测试与集成测试,到最终的部署上线等各个方面。
目录
- 摘要
- 目录
- 引言
- Spring Boot简介
- 环境搭建
- 创建第一个Spring Boot项目
- 配置管理
- 数据访问层
- Web服务开发
- 安全机制实现
- 日志记录
- 单元测试与集成测试
- 部署上线
- 总结与展望
引言
随着微服务架构逐渐成为主流趋势之一,选择一个合适的后端技术栈变得尤为重要。Spring Boot凭借其强大的生态支持和简便易用的特点,在众多解决方案中脱颖而出。本篇文章将带领大家一起探索Spring Boot的世界,解锁其背后的强大功能。
Spring Boot简介
定义
Spring Boot是由Pivotal团队提供的全新框架,用来简化新Spring应用的初始搭建以及开发过程。
特点
- 自动配置:基于约定优于配置的原则。
- 起步依赖:简化Maven或Gradle配置文件。
- 嵌入式服务器:无需额外安装Tomcat等容器即可运行Web应用。
- 命令行界面:支持直接生成项目结构。
环境搭建
首先确保你的机器上已经安装了以下软件:
- JDK(建议版本1.8及以上)
- Maven 或 Gradle
- IDE 如 IntelliJ IDEA 或 Eclipse
安装JDK
- 下载JDK:访问Oracle官网或OpenJDK下载适合你操作系统的JDK版本。
- 安装JDK:按照安装向导进行安装。
- 配置环境变量:
JAVA_HOME:指向JDK的安装路径。PATH:添加%JAVA_HOME%\bin(Windows)或$JAVA_HOME/bin(Linux/Mac)。
安装Maven
- 下载Maven:访问Maven官网下载最新版本的Maven。
- 解压下载的文件到指定目录。
- 配置环境变量:
MAVEN_HOME:指向Maven的解压路径。PATH:添加%MAVEN_HOME%\bin(Windows)或$MAVEN_HOME/bin(Linux/Mac)。
安装IDE
- 下载IntelliJ IDEA或Eclipse:访问IntelliJ IDEA官网或Eclipse官网下载适合你操作系统的版本。
- 安装并启动IDE。
创建第一个Spring Boot项目
使用Spring Initializr
- 访问Spring Initializr官网。
- 填写项目信息:
- Project:选择Maven Project。
- Language:选择Java。
- Spring Boot:选择最新的稳定版本。
- Project Metadata:
- Group:输入你的组织ID(如
com.example)。 - Artifact:输入项目名称(如
myapp)。 - Name:输入项目名称(如
myapp)。 - Description:输入项目描述。
- Package name:输入包名(如
com.example.myapp)。 - Packaging:选择Jar。
- Java:选择Java版本(如8或11)。
- Group:输入你的组织ID(如
- 添加依赖:
- Spring Web:用于创建Web应用。
- Spring Data JPA:用于数据访问。
- MySQL Driver:用于连接MySQL数据库。
- Spring Security:用于安全认证。
- Lombok:用于减少样板代码。
- 点击“Generate”按钮下载zip包。
- 解压下载的zip包,并在IDE中导入项目。
项目结构
导入项目后,可以看到如下主要组成部分:
src/main/java:存放Java源代码。src/main/resources:放置静态资源文件。pom.xml:项目构建脚本。
编辑主类
编辑主类Application.java,添加注解@SpringBootApplication标记这是一个Spring Boot启动类,并在其中编写入口方法:
package com.example.myapp;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
运行项目
保存后右键选择Run As -> Java Application,如果一切正常你应该能看到控制台输出类似以下信息:
Tomcat started on port(s): 8080 (http) with context path ''
Started Application in 2.376 seconds (JVM running for 3.459)
这表明我们的第一个Spring Boot程序已经成功运行起来了!
配置管理
Spring Boot提倡外部化配置,允许我们在不修改代码的情况下调整应用程序的行为。常见的做法是通过application.properties或application.yml文件来进行设置。
application.properties 示例
在src/main/resources目录下创建application.properties文件,并添加以下内容:
server.port=8081
spring.application.name=myapp
application.yml 示例
同样地,可以在src/main/resources目录下创建application.yml文件,并添加以下内容:
server:port: 8081
spring:application:name: myapp
多环境配置
可以通过不同的Profile特性根据不同环境加载特定配置文件。例如,创建application-dev.properties和application-prod.properties文件:
application-dev.properties
server.port=8081
spring.datasource.url=jdbc:mysql://localhost:3306/mydb_dev
spring.datasource.username=root
spring.datasource.password=root
application-prod.properties
server.port=8082
spring.datasource.url=jdbc:mysql://localhost:3306/mydb_prod
spring.datasource.username=root
spring.datasource.password=root
在启动时指定Profile:
mvn spring-boot:run -Dspring.profiles.active=dev
数据访问层
为了演示如何操作数据库,这里我们选用MySQL作为例子。首先需要添加相应的依赖项至pom.xml:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>
实体类
定义一个简单的User实体类:
package com.example.myapp.entity;import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.AUTO)private Long id;private String name;private String email;// Getters and Setterspublic Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}
}
Repository接口
定义一个UserRepository接口继承自JpaRepository:
package com.example.myapp.repository;import com.example.myapp.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;public interface UserRepository extends JpaRepository<User, Long> {
}
Service层
定义UserService类来处理业务逻辑:
package com.example.myapp.service;import com.example.myapp.entity.User;
import com.example.myapp.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;
import java.util.Optional;@Service
public class UserService {@Autowiredprivate UserRepository userRepository;public List<User> findAll() {return userRepository.findAll();}public Optional<User> findById(Long id) {return userRepository.findById(id);}public User save(User user) {return userRepository.save(user);}public void deleteById(Long id) {userRepository.deleteById(id);}
}
Web服务开发
借助于Spring MVC的强大支持,我们可以轻松地构建RESTful API。下面展示一个简单的控制器用于处理HTTP请求:
UserController
创建UserController类:
package com.example.myapp.controller;import com.example.myapp.entity.User;
import com.example.myapp.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;@GetMappingpublic List<User> getAllUsers() {return userService.findAll();}@GetMapping("/{id}")public ResponseEntity<User> getUserById(@PathVariable Long id) {return userService.findById(id).map(ResponseEntity::ok).orElse(ResponseEntity.notFound().build());}@PostMappingpublic User createUser(@RequestBody User user) {return userService.save(user);}@PutMapping("/{id}")public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User user) {if (userService.findById(id).isPresent()) {user.setId(id);return ResponseEntity.ok(userService.save(user));} else {return ResponseEntity.notFound().build();}}@DeleteMapping("/{id}")public ResponseEntity<Void> deleteUser(@PathVariable Long id) {if (userService.findById(id).isPresent()) {userService.deleteById(id);return ResponseEntity.noContent().build();} else {return ResponseEntity.notFound().build();}}
}
安全机制实现
安全对于任何互联网产品来说都是至关重要的环节。Spring Security提供了丰富的功能来保护你的应用免受攻击。可以通过引入相关依赖并配置SecurityConfig类来启用认证授权等功能。
添加依赖
在pom.xml中添加Spring Security依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>
配置Security
创建SecurityConfig类:
package com.example.myapp.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/admin/**").hasRole("ADMIN").antMatchers("/users/**").hasRole("USER").anyRequest().permitAll().and().formLogin().loginPage("/login").permitAll().and().logout().permitAll();}@Autowiredpublic void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().withUser("user").password(passwordEncoder().encode("password")).roles("USER").and().withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN");}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
}
日志记录
良好的日志系统可以帮助我们更好地追踪问题所在。Spring Boot默认集成了Logback作为日志框架。你可以在logback-spring.xml中自定义日志格式、级别等属性。
logback-spring.xml
在src/main/resources目录下创建logback-spring.xml文件:
<configuration><include resource="org/springframework/boot/logging/logback/base.xml"/><logger name="com.example.myapp" level="DEBUG" additivity="false"><appender-ref ref="STDOUT"/></logger><root level="INFO"><appender-ref ref="STDOUT"/></root>
</configuration>
单元测试与集成测试
编写高质量的测试用例有助于提高软件质量。Spring Boot推荐使用JUnit配合Mockito进行单元测试,而对于更复杂的场景,则可以考虑采用Spring Test模块提供的功能来进行集成测试。
添加依赖
在pom.xml中添加测试依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>
<dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><scope>test</scope>
</dependency>
单元测试
创建UserServiceTest类:
package com.example.myapp.service;import com.example.myapp.entity.User;
import com.example.myapp.repository.UserRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;import java.util.Optional;import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.*;class UserServiceTest {@InjectMocksprivate UserService userService;@Mockprivate UserRepository userRepository;@BeforeEachpublic void setUp() {MockitoAnnotations.initMocks(this);}@Testpublic void testFindById() {User mockUser = new User(1L, "John Doe", "john.doe@example.com");when(userRepository.findById(1L)).thenReturn(Optional.of(mockUser));User result = userService.findById(1L);assertEquals(mockUser, result);}@Testpublic void testSaveUser() {User newUser = new User(null, "Jane Doe", "jane.doe@example.com");User savedUser = new User(1L, "Jane Doe", "jane.doe@example.com");when(userRepository.save(newUser)).thenReturn(savedUser);User result = userService.save(newUser);assertEquals(savedUser, result);}@Testpublic void testDeleteById() {doNothing().when(userRepository).deleteById(1L);userService.deleteById(1L);verify(userRepository, times(1)).deleteById(1L);}
}
集成测试
创建UserControllerIntegrationTest类:
package com.example.myapp.controller;import com.example.myapp.entity.User;
import com.example.myapp.repository.UserRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;import java.util.Arrays;
import java.util.List;import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;@SpringBootTest
@AutoConfigureMockMvc
class UserControllerIntegrationTest {@Autowiredprivate MockMvc mockMvc;@Autowiredprivate UserRepository userRepository;@BeforeEachpublic void setUp() {userRepository.saveAll(Arrays.asList(new User(1L, "John Doe", "john.doe@example.com"),new User(2L, "Jane Doe", "jane.doe@example.com")));}@Testpublic void testGetAllUsers() throws Exception {mockMvc.perform(MockMvcRequestBuilders.get("/users").accept(MediaType.APPLICATION_JSON)).andExpect(MockMvcResultMatchers.status().isOk()).andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(2));}@Testpublic void testGetUserById() throws Exception {mockMvc.perform(MockMvcRequestBuilders.get("/users/1").accept(MediaType.APPLICATION_JSON)).andExpect(MockMvcResultMatchers.status().isOk()).andExpect(MockMvcResultMatchers.jsonPath("$.name").value("John Doe"));}@Testpublic void testCreateUser() throws Exception {User newUser = new User(null, "Alice", "alice@example.com");mockMvc.perform(MockMvcRequestBuilders.post("/users").contentType(MediaType.APPLICATION_JSON).content("{\"name\":\"Alice\",\"email\":\"alice@example.com\"}")).andExpect(MockMvcResultMatchers.status().isOk()).andExpect(MockMvcResultMatchers.jsonPath("$.name").value("Alice"));}@Testpublic void testUpdateUser() throws Exception {User updatedUser = new User(1L, "John Updated", "john.updated@example.com");mockMvc.perform(MockMvcRequestBuilders.put("/users/1").contentType(MediaType.APPLICATION_JSON).content("{\"id\":1,\"name\":\"John Updated\",\"email\":\"john.updated@example.com\"}")).andExpect(MockMvcResultMatchers.status().isOk()).andExpect(MockMvcResultMatchers.jsonPath("$.name").value("John Updated"));}@Testpublic void testDeleteUser() throws Exception {mockMvc.perform(MockMvcRequestBuilders.delete("/users/1")).andExpect(MockMvcResultMatchers.status().isNoContent());mockMvc.perform(MockMvcRequestBuilders.get("/users/1").accept(MediaType.APPLICATION_JSON)).andExpect(MockMvcResultMatchers.status().isNotFound());}
}
部署上线
当所有开发工作完成后,下一步就是将应用部署到生产环境中。Spring Boot支持多种方式打包发布,包括传统的WAR包形式以及更加轻量级的JAR包。通常情况下推荐后者,因为它包含了运行所需的一切依赖。
打包
执行以下命令生成可执行jar文件:
mvn clean package -DskipTests
启动
之后只需一条简单的命令就能启动服务:
java -jar target/myapp.jar
总结与展望
通过以上步骤的学习,相信你对如何利用Spring Boot快速搭建高效的应用已经有了比较全面的认识。当然这只是冰山一角,Spring Boot还有更多高级特性和插件等待着你去发掘。希望这篇文章能为你开启一段精彩的编程之旅!
相关文章:
【构建企业级Spring Boot应用:从基础到高级的全面指南】
摘要 本文旨在为开发者提供一份详尽的指南,帮助大家深入理解并掌握如何使用Spring Boot框架来快速开发企业级应用程序。通过实际案例分析、代码示例以及架构设计思路分享,读者不仅能够学习到理论知识,还能获得宝贵的实践经验。本文将涵盖从环…...
DAV_postgresql_3-schema
schem介绍: 什么是schema? 用户对象的集合叫做模式 不同模式下的对象可以同名 可以把用户下对象根据业务分类,不同的对象放在不同的模式 一个用户可以创与拥有多个模式 一个模式只能属于一个用户 普通用户创建模式需要授权指定数据库下的创建权限…...
Hive-04之存储格式、SerDe、企业级调优
一、主题 hive表的数据压缩和文件存储格式hive的自定义UDF函数hive的JDBC代码操作hive的SerDe介绍和使用hive的优化 二、要点 1. hive表的文件存储格式 Hive支持的存储数的格式主要有:TEXTFILE(行式存储) 、SEQUENCEFILE(行式存储)、ORC&…...
信号和槽
connect(信号发送者,发送的信号,信号接收者,信号的处理); 信号函数和槽函数的参数必须是一样的,但信号的参数可以多余槽函数的参数(前面的参数类型必须一致) 是控件和控件间的信号传递,这两个…...
从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(八) 聊天框用户列表
简单画了个聊天框 就是咱们的HomePage.jsx 1.后端接口开发 在server/src/index.js 新增 messagesRoutes 先引入 import messageRoutes from ./routes/message.route.js // 消息接口 app.use(/api/messages, messageRoutes) 在routes文件夹下新建message.route.js 有3个路…...
关于后端使用Boolean或boolean时前端收到的参数的区别
当后端使用的是Boolean时,调用的方法是setIsLoginUser,前端收到的参数的参数名是isLoginUser 而当后端使用的是boolean时,调用的方法是setLoginUser,前端收到的参数的参数名是loginUser 封装类和基本数据类型在使用时需要注意这…...
智能称重搬物寻迹小车(论文+源码)
1 系统设计方案确定 本次设计的总系统有以下几个模块分别是避障模块,循迹模块,二维码扫描电路,称重电路,LCD显示电路和电机驱动模块,而且这几个模块都是由单片机stm32控制的,整个系统的框图如下图所示。其…...
使用 ASP.NET Core 创建和下载 zip 文件
对于最近的一个功能,我必须从用 ASP.NET Core 编写的内部网站下载一批文件。在下载文件之前对其进行压缩,结果证明这是一种轻松实现多文件下载的好方法。.NET 提供了所有需要的功能,在本文中,我将向您展示如何实现它。 首先&#…...
“深入浅出”系列之音视频开发:(12)使用FFmpeg实现倍速播放:技术细节与优化思路
一、前言 在音视频处理领域,倍速播放是一个常见的需求,尤其是在视频播放器、在线教育平台等场景中,用户常常需要以不同的速度播放视频内容。然而,实现一个高质量的倍速播放功能并不容易,尤其是在处理音频时࿰…...
dify绑定飞书多维表格
dify 绑定飞书和绑定 notion 有差不多的过程,都需要套一层应用的壳子,而没有直接可以访问飞书文档的 API。本文记录如何在dify工具中使用新增多条记录工具。 创建飞书应用 在飞书开放平台创建一个应用,个人用户创建企业自建应用。 自定义应…...
SQL server配置ODBC数据源(本地和服务器)
本地配置 1. 控制面板中找到系统ODBC数据源(打开控制面板直接搜) 2. 选择“系统DSN”,点击“添加” 3. 选择“SQL server” 4. 名称和描述自己填,服务器选择本机设备名称 5. 选择ID和密码验证,并填写本地SQL server登…...
LogiSim教程
一、LogiSim是什么 Logisim是一种设计数字电路的工具。 二、安装LogiSim 下载地址 https://sourceforge.net/projects/circuit/ 此软件需要java运行环境。 三、使用LogiSim (一)界面 Logisim界面分为菜单栏、工具栏、资源管理器,属性表…...
RAP: Efficient Text-Video Retrieval with Sparse-and-Correlated Adapter
标题:RAP:基于稀疏相关适配器的高效文本视频检索 原文链接:RAP: Efficient Text-Video Retrieval with Sparse-and-Correlated Adapter - ACL Anthology 发表:ACL-2024(NLP领域CCF A类) 摘要 文本-视频检索(TVR࿰…...
I2C驱动(十一) -- gpio模拟的i2c总线驱动i2c-gpio.c分析
相关文章 I2C驱动(一) – I2C协议 I2C驱动(二) – SMBus协议 I2C驱动(三) – 驱动中的几个重要结构 I2C驱动(四) – I2C-Tools介绍 I2C驱动(五) – 通用驱动i2c-dev.c分析 I2C驱动(六) – I2C驱动程序模型 I2C驱动(七) – 编写I2C设备驱动之i2c_driver I2C驱动(八) – 编写I2C…...
不要升级,Flutter Debug 在 iOS 18.4 beta 无法运行,提示 mprotect failed: Permission denied
近期如果有开发者的 iOS 真机升级到 18.4 beta,大概率会发现在 debug 运行时会有 Permission denied 的相关错误提示,其实从 log 可以很直观看出来,就是 Dart VM 在初始化时,对内核文件「解释运行(JIT)」时…...
zjbdt
嵌入式软件工程师可以通过考取相关职业证书来提升专业能力和职业竞争力。以下是几种含金量较高且广受认可的证书: 1. NIEH 嵌入式技术工程师证书 颁发机构:教育部考试中心级别:初级、中级、高级内容:涵盖嵌入式系统的基础理论、开…...
【3天快速入门WPF】11-附加属性
目录 1. 步骤1:定义附加属性2. 示例代码3. 步骤2:在XAML中使用附加属性3.1. 示例代码4. 步骤3:扩展使用场景4.1. 示例代码5. 总结上一篇讲到了依赖属性,本篇主要想说一下附加属性。 在WPF中,附加属性(Attached Property)是一种特殊的依赖属性,允许你在不属于某个类的控…...
私有化部署大模型推理性能分析
从用户感知角度分析私有化部署的大模型推理性能,这里的用户感知包括响应速度、生成速度、系统可用性以及系统稳定性。大模型首先获取输入内容的字符串,将这部分内容转换为模型token,过模型推理,到最后输出第一个token的时间是ttft,从这以后&a…...
版图自动化连接算法开发 00001 ------ 直接连接两个给定的坐标点
版图自动化连接算法开发 00001 ------ 直接连接两个给定的坐标点 引言正文定义坐标点的类绘图显示代码直接连接两个坐标点引言 由于人工智能的加速普及,每次手动绘制版图都会觉得特别繁琐,作者本人在想可否搞一个自动化连接器件端口的算法,后期可以根据一些设定的限制进行避…...
UniApp 按钮组件 open-type 属性详解:功能、场景与平台差异
文章目录 引言一、open-type 基础概念1.1 核心作用1.2 通用使用模板 二、主流 open-type 值详解2.1 contact - 客服会话功能说明平台支持代码示例 2.2 share - 内容转发功能说明平台支持注意事项 2.3 getUserInfo - 获取用户信息功能说明平台支持代码示例 2.4 getPhoneNumber -…...
EtherCAT总线绝对值伺服如何使用
EtherCAT总线掉线如何自动重启。 EtherCAT总线掉线如何自动重启_ethercat从站断线-CSDN博客文章浏览阅读1.2k次。本文介绍了在EtherCAT通信中,当从站出现掉线情况时,如何通过设置自动重启功能来解决这一问题。详细步骤包括在CODESYS环境中启用从站的自动重启选项。https://r…...
可商用街头文化艺术海报封面手写涂鸦标题LOGO排版英文字体 FS163 TYPE FACE
Freestyle 163 (FS163)是一个受街头文化和城市艺术启发的视觉宣言。该字体旨在突出我们的文化和创意根源,反映了街头运动、城市艺术以及来自社会和边缘的故事。 FS163与面临挑战、质疑规范、放大被忽视声音的品牌和个人联系在一起,…...
使用3090显卡部署Wan2.1生成视频
layout: post title: 使用3090显卡部署Wan2.1生成视频 catalog: true tag: [Kubernetes, GPU, AI] 使用3090显卡部署Wan2.1生成视频 1. 环境说明2. 模型下载3. 克隆仓库4. 安装依赖5. 生成视频 5.1. 使用generate脚本生成5.2. 使用gradio启动UI界面生成 5.2.1. 启动gradio服务5…...
js逆向常用代码
js逆向常用代码 加载 const loadingStyle #loadingDiv {position: fixed;z-index: 9999;top: 0;left: 0;width: 100%;height: 100%;background-color: rgba(255, 255, 255, 0.8);display: flex;align-items: center;justify-content: center;flex-direction: column;}.loade…...
Diffusion——扩散模型(未完待续)
论文链接:https://arxiv.org/abs/2006.11239 简介 扩散模型(Diffusion Model)是用于生成数据的一类深度生成模型,特别擅长于图像生成。其工作原理基于通过随机噪声的逐步转换来生成目标数据。扩散模型分为两部分:正向…...
Java内存管理与性能优化实践
Java内存管理与性能优化实践 Java作为一种广泛使用的编程语言,其内存管理和性能优化是开发者在日常工作中需要深入了解的重要内容。Java的内存管理机制借助于垃圾回收(GC)来自动处理内存的分配和释放,但要实现高效的内存管理和优…...
unsloth报错FileNotFoundError: [WinError 3] 系统找不到指定的路径。
运行平台 Windows 报错信息 Traceback (most recent call last): File “C:\Python312\Lib\site-packages\IPython\core\interactiveshell.py”, line 3577, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File “”, line 1, in runfile(‘D:\python_pr…...
不同规模企业如何精准选择AI工具: DeepSeek、Grok 和 ChatGPT 三款主流 AI 工具深度剖析与对比
本文深入探讨了最近国内外主流的 DeepSeek、Grok 和 ChatGPT 三款主流 AI 工具的技术细节、性能表现、应用场景及局限性,并从技术能力、功能需求、成本预算、数据安全和合规以及服务与支持五个关键维度,详细分析了不同规模企业在选择 AI 工具时的考量因素…...
各章节详细总结与 Vue 学习收尾
各章节详细总结与 Vue学习收尾 第一章:基础入门 通俗理解:这就像你刚踏入一个新的游戏世界,得先搞清楚游戏的基本规则和操作方法。在 Vue 3 的学习里,就是要搭建好开发环境,认识 Vue 3 的基本概念,比如模…...
c++ 文件及基本读写总结
在 C 中,文件操作是非常重要的一部分,主要用于将数据存储到文件中,或者从文件中读取数据。C 标准库提供了fstream头文件,其中包含了用于文件操作的类,主要有ifstream(用于输入文件流,即从文件读…...
