从零开始:Spring Boot核心概念与架构解析

news2025/4/26 8:48:07

引言

在当今的Java开发领域,Spring Boot已经成为构建企业级应用的首选框架之一。它以其简洁、高效、易于上手的特点,极大地简化了Spring应用的开发过程。本文将从Spring Boot的核心概念入手,深入解析其架构设计和运行原理,帮助读者从零开始全面理解Spring Boot。

一、Spring Boot简介

1.1 什么是Spring Boot?

Spring Boot是由Pivotal团队提供的基于Spring框架的全新开源Java基础框架。它旨在简化Spring应用的初始搭建以及开发过程,让开发者能够更专注于业务逻辑的实现,而不是繁琐的配置。

Spring Boot的核心目标包括:

  • 简化配置:通过自动配置机制,Spring Boot能够根据项目依赖自动配置Spring和相关技术,从而减少开发者需要编写的配置代码。

  • 独立运行:Spring Boot内置了Tomcat、Jetty等嵌入式Servlet容器,无需部署WAR文件,应用可以直接以jar包形式运行。

  • 非侵入式:Spring Boot不会限制你使用特定的类加载器、线程工厂或任何其他特定的系统属性,它完全非侵入式。

  • 生产就绪:Spring Boot提供了生产级功能,如健康检查、指标收集、应用监控等,帮助开发者更好地管理应用。

1.2 Spring Boot的版本与兼容性

Spring Boot自发布以来,经历了多个版本的迭代。截至本文撰写时,Spring Boot 3.x已经广泛应用于生产环境。Spring Boot 3.x基于Spring Framework 6.x开发,支持Java 17及以上版本,并且对Spring Cloud、Spring Data等子项目进行了深度集成和优化。

在选择Spring Boot版本时,建议根据项目需求和团队技术栈选择合适的版本。对于新项目,推荐使用最新的稳定版本,以获得更好的性能和功能支持。

1.3 Spring Boot与Spring框架的关系

Spring Boot是基于Spring框架的扩展,它并非替代Spring,而是简化了Spring应用的开发过程。Spring Boot的核心是Spring框架,它继承了Spring的依赖注入、事务管理、AOP等功能,并在此基础上提供了自动配置、独立运行等特性。

二、Spring Boot的核心概念

2.1 Spring Boot的启动流程

Spring Boot应用的启动流程是理解其核心机制的关键。一个典型的Spring Boot应用从main方法开始,通过SpringApplication类启动。以下是启动流程的简化步骤:

  1. 创建SpringApplication实例SpringApplication是Spring Boot应用的启动入口,它负责初始化Spring应用上下文。

  2. 加载配置:Spring Boot会加载application.propertiesapplication.yml中的配置,并将其注入到Spring应用上下文中。

  3. 自动配置:Spring Boot通过@EnableAutoConfiguration注解自动配置Spring应用,根据项目依赖自动加载相关的配置类。

  4. 初始化应用上下文:Spring Boot会创建一个ApplicationContext,并加载所有的Bean。

  5. 启动嵌入式容器:如果项目中包含嵌入式Servlet容器(如Tomcat),Spring Boot会自动启动容器并监听指定端口。

2.2 @SpringBootApplication注解

@SpringBootApplication是Spring Boot的核心注解,它是一个组合注解,包含了以下三个注解:

  • @SpringBootConfiguration:标识当前类是一个Spring Boot配置类,等同于Spring中的@Configuration注解。

  • @EnableAutoConfiguration:启用Spring Boot的自动配置机制,根据项目依赖自动加载相关的配置类。

  • @ComponentScan:启用组件扫描,扫描当前包及其子包中的Spring组件(如@Controller@Service@Repository等)。

java复制

@SpringBootApplication
public class MySpringBootApplication {
    public static void main(String[] args) {
        SpringApplication.run(MySpringBootApplication.class, args);
    }
}

2.3 自动配置原理

自动配置是Spring Boot的核心特性之一。Spring Boot通过@EnableAutoConfiguration注解启用自动配置机制。在启动时,Spring Boot会扫描META-INF/spring.factories文件,加载其中定义的自动配置类。

这些自动配置类通常以*AutoConfiguration结尾,例如DataSourceAutoConfigurationJpaAutoConfiguration等。每个自动配置类都通过条件注解(如@ConditionalOnClass@ConditionalOnMissingBean等)判断是否需要加载某个配置。

例如,当项目中包含spring-boot-starter-web依赖时,Spring Boot会自动加载WebMvcAutoConfiguration,从而配置Spring MVC相关的Bean。

2.4 配置文件

Spring Boot支持多种配置文件格式,包括application.propertiesapplication.yml。配置文件用于定义应用的运行参数,如数据库连接信息、服务器端口、日志配置等。

application.properties文件是一个简单的键值对文件,例如:

properties复制

server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=123456

application.yml文件支持嵌套结构,更适合复杂的配置需求,例如:

yaml复制

server:
  port: 8080
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: 123456

Spring Boot会优先加载application.properties文件,如果同时存在application.yml文件,则application.yml中的配置会覆盖application.properties中的同名配置。

2.5 Profile配置

Profile是Spring Boot用于管理不同环境配置的功能。通过Profile,开发者可以为开发、测试和生产环境定义不同的配置文件,例如application-dev.propertiesapplication-test.propertiesapplication-prod.properties

在启动应用时,可以通过spring.profiles.active参数指定当前激活的Profile。例如:

properties复制

# application.properties
spring.profiles.active=dev

或者通过命令行参数指定:

bash复制

java -jar myapp.jar --spring.profiles.active=prod

2.6 Starter模块

Starter模块是Spring Boot的核心组件之一,它提供了一种“一站式”的依赖管理方式。通过引入Starter模块,开发者可以快速集成Spring Boot提供的各种功能,而无需手动管理复杂的依赖。

例如,spring-boot-starter-web模块提供了Spring MVC和嵌入式Servlet容器的依赖,开发者只需在pom.xml中添加以下依赖即可:

xml复制

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Spring Boot提供了多种Starter模块,涵盖了Web开发、数据访问、消息队列、安全等多个领域。开发者可以根据项目需求选择合适的Starter模块。

2.7 嵌入式Servlet容器

Spring Boot内置了Tomcat、Jetty和Undertow等嵌入式Servlet容器,开发者无需单独部署WAR文件,应用可以直接以jar包形式运行。默认情况下,Spring Boot使用Tomcat作为嵌入式容器。

嵌入式容器的配置可以通过application.properties文件进行自定义,例如:

properties复制

server.port=8080
server.servlet.context-path=/myapp

如果需要切换到其他嵌入式容器,可以通过排除默认的Tomcat依赖并引入其他容器的依赖来实现。例如,切换到Jetty:

xml复制

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

三、Spring Boot的架构设计

3.1 Spring Boot的分层架构

Spring Boot的架构设计遵循了经典的分层架构模式,主要包括以下几个层次:

  • 控制层(Controller):负责处理HTTP请求,返回响应。通常使用@Controller@RestController注解定义。

  • 服务层(Service):负责业务逻辑的实现,通常使用@Service注解定义。

  • 持久层(Repository):负责数据访问,通常使用@Repository注解定义。

  • 实体层(Entity):定义业务对象的模型,通常使用JPA注解定义。

  • 配置层(Configuration):负责定义Spring应用的配置,通常使用@Configuration注解定义。

这种分层架构模式使得Spring Boot应用具有良好的可扩展性和可维护性。

3.2 Spring Boot的依赖管理

Spring Boot的依赖管理是通过Maven或Gradle实现的。Spring Boot提供了一个统一的依赖管理模块spring-boot-dependencies,它定义了Spring Boot及其相关项目的核心依赖版本。

pom.xml文件中,开发者可以通过引入spring-boot-starter-parent父项目来继承这些依赖管理配置:

xml复制

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.0.0</version>
</parent>

通过这种方式,开发者可以避免手动管理复杂的依赖版本,同时确保项目依赖的一致性。

3.3 Spring Boot的插件机制

Spring Boot提供了强大的插件机制,通过spring-boot-maven-pluginspring-boot-gradle-plugin,开发者可以方便地将Spring Boot应用打包为可执行jar文件。

例如,在Maven项目中,可以通过以下配置将应用打包为可执行jar文件:

xml复制

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

在Gradle项目中,可以通过以下配置实现相同的功能:

groovy复制

plugins {
    id 'org.springframework.boot' version '3.0.0'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

通过插件机制,Spring Boot简化了应用的打包和部署过程,使得开发者可以更加专注于业务逻辑的实现。

3.4 Spring Boot的健康检查与监控

Spring Boot提供了丰富的健康检查和监控功能,通过spring-boot-actuator模块,开发者可以轻松地监控应用的运行状态。

spring-boot-actuator模块提供了多种端点(Endpoint),用于暴露应用的健康信息、指标数据、配置信息等。例如,/actuator/health端点可以返回应用的健康状态,/actuator/metrics端点可以返回应用的性能指标。

开发者可以通过application.properties文件自定义端点的访问路径和安全性,例如:

properties复制

management.endpoints.web.base-path=/manage
management.endpoint.health.probes.enabled=true
management.health.livenessState.enabled=true

通过健康检查和监控功能,开发者可以更好地管理Spring Boot应用的运行状态,及时发现和解决问题。

四、Spring Boot的高级特性

4.1 数据访问与JPA

Spring Boot提供了对多种数据访问技术的支持,包括JPA、MyBatis、JDBC等。其中,JPA(Java Persistence API)是最常用的ORM框架之一。

Spring Boot通过spring-boot-starter-data-jpa模块提供了对JPA的支持。开发者可以通过定义实体类和仓库接口(Repository)来实现数据访问功能。

例如,定义一个用户实体类:

java复制

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private String email;

    // 省略getter和setter方法
}

定义一个用户仓库接口:

java复制

public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findByName(String name);
}

通过这种方式,Spring Boot会自动实现UserRepository接口,并提供基本的CRUD操作以及自定义查询方法。

4.2 安全与Spring Security

Spring Boot通过spring-boot-starter-security模块提供了对Spring Security的支持。Spring Security是一个功能强大的安全框架,用于保护Spring应用免受各种安全威胁。

开发者可以通过定义安全配置类来实现用户认证、授权、密码加密等功能。例如:

java复制

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .antMatchers("/user/**").hasRole("USER")
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .and()
            .httpBasic();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("user").password("{noop}password").roles("USER")
            .and()
            .withUser("admin").password("{noop}password").roles("ADMIN");
    }
}

通过Spring Security,开发者可以轻松地实现用户登录、角色授权、密码加密等功能,从而保护Spring Boot应用的安全性。

4.3 微服务与Spring Cloud

Spring Boot与Spring Cloud结合,可以构建强大的微服务架构。Spring Cloud提供了一系列的微服务开发工具,包括服务注册与发现、配置中心、API网关、断路器等。

例如,通过spring-cloud-starter-netflix-eureka-client模块,开发者可以将Spring Boot应用注册到Eureka服务注册中心:

xml复制

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

application.properties文件中配置Eureka服务地址:

properties复制

eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

通过这种方式,Spring Boot应用可以轻松地实现服务注册与发现,从而构建微服务架构。

4.4 异步编程与WebFlux

Spring Boot 2.x引入了WebFlux模块,支持响应式编程模型。WebFlux基于Reactor框架,提供了异步、非阻塞的编程方式,适用于高并发场景。

开发者可以通过定义响应式控制器来实现异步请求处理:

java复制

@RestController
public class ReactiveController {
    @GetMapping("/reactive")
    public Mono<String> reactive() {
        return Mono.just("Hello, WebFlux!");
    }
}

通过WebFlux,开发者可以实现高性能的异步应用,提升系统的吞吐量和响应速度。

4.5 定时任务与@Scheduled

Spring Boot支持定时任务的开发,通过@Scheduled注解,开发者可以定义定时执行的任务。例如:

java复制

@Configuration
@EnableScheduling
public class ScheduledTasks {
    @Scheduled(fixedRate = 5000)
    public void fixedRateJob() {
        System.out.println("Fixed rate job executed at: " + new Date());
    }

    @Scheduled(cron = "0 0/30 * * * ?")
    public void cronJob() {
        System.out.println("Cron job executed at: " + new Date());
    }
}

通过@Scheduled注解,开发者可以轻松地实现定时任务,满足业务需求。

五、Spring Boot的性能优化

5.1 启动性能优化

Spring Boot应用的启动速度是影响开发效率的重要因素之一。以下是一些优化启动性能的建议:

  • 减少依赖:避免引入不必要的依赖,减少Spring应用上下文的初始化时间。

  • 延迟加载Bean:通过@Lazy注解延迟加载Bean,减少应用启动时的内存占用。

  • 优化自动配置:通过@Conditional注解优化自动配置类的加载条件,避免不必要的配置加载。

  • 使用JVM参数优化启动:通过设置JVM参数(如-XX:TieredStopAtLevel=1)优化JVM的启动性能。

5.2 运行性能优化

Spring Boot应用的运行性能直接影响用户体验。以下是一些优化运行性能的建议:

  • 使用缓存:通过@Cacheable注解缓存重复计算的结果,减少数据库访问次数。

  • 优化数据库访问:使用连接池(如HikariCP)优化数据库连接管理,减少数据库访问延迟。

  • 异步处理:通过@Async注解实现异步任务处理,提升应用的响应速度。

  • 使用响应式编程:通过WebFlux实现异步、非阻塞的请求处理,提升系统的吞吐量。

5.3 部署性能优化

Spring Boot应用的部署方式也会影响性能。以下是一些优化部署性能的建议:

  • 使用嵌入式容器:使用嵌入式Servlet容器(如Tomcat)部署应用,减少部署复杂度。

  • 优化打包配置:通过spring-boot-maven-pluginspring-boot-gradle-plugin优化应用的打包配置,减少打包时间。

  • 使用容器化部署:通过Docker容器化部署应用,实现环境一致性,减少部署问题。

六、Spring Boot的常见问题与解决方案

6.1 自动配置冲突

当项目中存在多个自动配置类时,可能会导致配置冲突。解决方法是通过@Conditional注解定义配置类的加载条件,避免不必要的配置加载。

6.2 性能问题

如果Spring Boot应用出现性能问题,可以通过以下方式排查和解决:

  • 使用监控工具:通过Spring Boot Actuator监控应用的运行状态,查找性能瓶颈。

  • 优化代码:通过代码分析工具(如JProfiler)优化应用的代码逻辑,减少不必要的计算。

  • 优化配置:通过优化数据库配置、缓存配置等提升应用的性能。

6.3 安全问题

如果Spring Boot应用存在安全漏洞,可以通过以下方式解决:

  • 使用Spring Security:通过Spring Security实现用户认证、授权等功能,保护应用的安全性。

  • 使用HTTPS:通过HTTPS加密通信数据,防止数据泄露。

  • 定期更新依赖:定期更新Spring Boot及其相关依赖,修复已知的安全漏洞。

七、Spring Boot的未来发展方向

7.1 云原生支持

随着云原生技术的发展,Spring Boot也在不断加强与云原生技术的结合。例如,Spring Boot 3.x已经对Kubernetes提供了更好的支持,包括自动配置、健康检查、服务发现等功能。

7.2 响应式编程

响应式编程是Spring Boot未来的重要发展方向之一。通过WebFlux模块,Spring Boot支持异步、非阻塞的编程方式,适用于高并发场景。

7.3 微服务架构

微服务架构是现代应用开发的重要趋势之一。Spring Boot与Spring Cloud结合,可以构建强大的微服务架构,满足企业级应用的需求。

八、总结

Spring Boot作为Spring框架的扩展,极大地简化了Spring应用的开发过程。通过自动配置、独立运行、非侵入式等特性,Spring Boot让开发者能够更加专注于业务逻辑的实现。本文从Spring Boot的核心概念入手,深入解析了其架构设计和运行原理,希望对读者有所帮助。

在实际开发中,开发者可以根据项目需求选择合适的Spring Boot版本和功能模块,通过优化配置和代码实现高性能、高可用的Spring Boot应用。同时,随着云原生技术、响应式编程和微服务架构的发展,Spring Boot也在不断演进,为开发者提供了更强大的功能和更好的开发体验。

 

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

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

相关文章

深入 Flutter 和 Compose 的 PlatformView 实现对比,它们是如何接入平台控件

在上一篇《深入 Flutter 和 Compose 在 UI 渲染刷新时 Diff 实现对比》发布之后&#xff0c;收到了大佬的“催稿”&#xff0c;想了解下 Flutter 和 Compose 在 PlatformView 实现上的对比&#xff0c;恰好过去写过不少 Flutter 上对于 PlatformView 的实现&#xff0c;这次恰好…

无人机飞手考证难度增加,实操、地面站教学技术详解

随着无人机技术的快速发展和广泛应用&#xff0c;无人机飞手考证的难度确实在不断增加。这主要体现在对飞手的实操技能和地面站操作技术的要求上。以下是对无人机飞手考证中实操和地面站教学技术的详细解析&#xff1a; 一、实操教学技术详解 1. 无人机基础知识学习&#xff1…

linux下springboot项目nohup日志或tomcat日志切割处理方案

目录 1. 配置流程 2. 配置说明 其他配置选项&#xff1a; 3. 测试执行 4. 手动执行 https://juejin.cn/post/7081890486453010469 通常情况下&#xff0c;我们的springboot项目部署到linux服务器中&#xff0c;通过nohup java -jar xxx.jar &指令来进行后台运行我们…

知识图谱可视化:揭示隐藏的模式与关系

目录 前言1. 什么是知识图谱可视化1.1 知识图谱概述1.2 知识图谱可视化的定义 2. 知识图谱可视化的意义2.1 降低理解门槛2.2 帮助发现模式与洞察2.3 提升交互性与用户体验 3. 知识图谱可视化的技术实现3.1 数据处理与准备3.2 可视化技术3.3 用户交互设计 4. 知识图谱可视化的应…

深度学习基础--LSTM学习笔记(李沐《动手学习深度学习》)

前言 LSTM是RNN模型的升级版&#xff0c;神经网络模型较为复杂&#xff0c;这里是学习笔记的记录&#xff1b;LSTM比较复杂&#xff0c;可以先看&#xff1a; 深度学习基础–一文搞懂RNN 深度学习基础–GRU学习笔记(李沐《动手学习深度学习》) RNN&#xff1a;RNN讲解参考&am…

电气防火保护器为高校学生宿舍提供安全保障

摘 要&#xff1a;3月2日&#xff0c;清华大学紫荆学生公寓发生火情&#xff0c;无人员伤亡。推断起火原因系中厅内通电电器发生故障引燃周边可燃物所致。2月27日&#xff0c;贵州某高校女生宿舍发生火灾&#xff0c;现场明火得到有效控制&#xff0c;无人员受伤。2月19日&…

每打开一个chrome页面都会【自动打开F12开发者模式】,原因是 使用HBuilderX会影响谷歌浏览器的浏览模式

打开 HBuilderX&#xff0c;点击 运行 -> 运行到浏览器 -> 设置web服务器 -> 添加chrome浏览器安装路径 chrome谷歌浏览器插件 B站视频下载助手插件&#xff1a; 参考地址&#xff1a;Chrome插件 - B站下载助手&#xff08;轻松下载bilibili哔哩哔哩视频&#xff09…

C#使用WMI获取控制面板中安装的所有程序列表

C#使用WMI获取控制面板中安装的所有程序列表 WMI 全称Windows Management Instrumentation,Windows Management Instrumentation是Windows中用于提供共同的界面和对象模式以便访问有关操作系统、设备、应用程序和服务的管理信息。如果此服务被终止&#xff0c;多数基于 Windo…

企业级流程架构设计思路-基于价值链的流程架构

获取更多企业流程资料 纸上得来终觉浅&#xff0c;绝知此事要躬行 一.企业流程分级规则定义 1.流程分类分级的总体原则 2.完整的流程体系需要体现出流程的分类分级 03.通用的流程分级方法 04.流程分级的标准 二.企业流程架构设计原则 1.流程架构设计原则 流程框架是流程体…

PyTorch使用教程(8)-一文了解torchvision

一、什么是torchvision torchvision提供了丰富的功能&#xff0c;主要包括数据集、模型、转换工具和实用方法四大模块。数据集模块内置了多种广泛使用的图像和视频数据集&#xff0c;如ImageNet、CIFAR-10、MNIST等&#xff0c;方便开发者进行训练和评估。模型模块封装了大量经…

如何将自己本地项目开源到github上?

环境&#xff1a; LLMB项目 问题描述&#xff1a; 如何将自己本地项目开源到github上&#xff1f; 解决方案&#xff1a; 步骤 1: 准备本地项目 确保项目整洁 确认所有的文件都在合适的位置&#xff0c;并且项目的 README.md 文件已经完善。检查是否有敏感信息&#xff0…

ConvBERT:通过基于跨度的动态卷积改进BERT

摘要 像BERT及其变体这样的预训练语言模型最近在各种自然语言理解任务中取得了令人印象深刻的性能。然而&#xff0c;BERT严重依赖于全局自注意力机制&#xff0c;因此存在较大的内存占用和计算成本。尽管所有的注意力头都从全局角度查询整个输入序列以生成注意力图&#xff0…

2025web建议

随便收集的信息 新手入门路线推荐 第一步&#xff1a;Web安全相关概念 建议学习时间&#xff1a;2周 学习内容如下&#xff1a; 1、熟悉基本概念(SQL注入、上传、XSS、CSRF、一句话木马等)。 2、通过关键字(SQL注入、上传、XSS、CSRF、一句话木马等)进行Google。 3、阅读《Web…

用JAVA实现人工智能:采用框架Spring AI Java

Spring AI 集成人工智能&#xff0c;为Java项目添加AI功能指南 本文主旨是用实际的可操作的代码&#xff0c;介绍Java怎么通过spring ai 接入大模型。 例子使用spring ai alibaba QWen千问api完成&#xff0c;你可以跑通以后换自己的实现。QWen目前有100万免费Token额度&…

【JDBC】数据库连接的艺术:深入解析数据库连接池、Apache-DBUtils与BasicDAO

文章目录 前言&#x1f30d; 一.连接池❄️1. 传统获取Conntion问题分析❄️2. 数据库连接池❄️3.连接池之C3P0技术&#x1f341;3.1关键特性&#x1f341;3.2配置选项&#x1f341;3.3使用示例 ❄️4. 连接池之Druid技术&#x1f341; 4.1主要特性&#x1f341; 4.2 配置选项…

canvas 图片组合并进行下载

运行图片&#xff1a; 思路&#xff1a;先画一个背景图片&#xff0c;再画一个二维码定位到你想要的位置&#xff0c;最后直接下载即可&#xff0c;可以扩散一下思维&#xff0c;画简单的海报的时候&#xff0c;也可以的 源代码 <!DOCTYPE html> <html lang"en&q…

记一次升级请求创建报错问题的调查过程(Windchill)

问题现象描述&#xff1a; ​ 新建申请请求单&#xff0c;在选择某些物料时会报此错误&#xff0c;选另外的物料时又可以正常创建&#xff0c;不报此错误。 问题原因分析&#xff1a; ​ 1.分析后台日志 —没有任何进展&#xff0c;此报错应该是前端的报错 ​ 2.从前端下手…

自旋锁与CAS

上文我们认识了许许多多的锁&#xff0c;此篇我们的CAS就是从上文的锁策略开展的新概念&#xff0c;我们来一探究竟吧 1. 什么是CAS&#xff1f; CAS: 全称Compare and swap&#xff0c;字⾯意思:“比较并交换”&#xff0c;⼀个CAS涉及到以下操作&#xff1a; 我们假设内存中…

线程池遇到未处理的异常会崩溃吗?

线程池中的 execute 和 submit 方法详解 目录 引言execute 方法 使用示例代码 submit 方法 2.1 提交 Callable 任务2.2 提交 Runnable 任务 遇到未处理异常 3.1 execute 方法遇到未处理异常3.2 submit 方法遇到未处理异常 小结 引言 在多线程编程中&#xff0c;线程池是提高性…

2024年第十五届蓝桥杯青少组国赛(c++)真题—快速分解质因数

快速分解质因数 完整题目和在线测评可点击下方链接前往&#xff1a; 快速分解质因数_C_少儿编程题库学习中心-嗨信奥https://www.hixinao.com/tiku/cpp/show-3781.htmlhttps://www.hixinao.com/tiku/cpp/show-3781.html 若如其他赛事真题可自行前往题库中心查找&#xff0c;题…