Spring Boot:让微服务开发像搭积木一样简单!

带你一探 Spring Boot 的自动配置和 Starter POMs 的神奇之处,展示如何通过几个简单的步骤就能让你的微服务应用在云端翱翔!

文章目录

      • 1. 引言
      • 1.1 简述Spring框架的起源与重要性
      • 1.2 阐述文章目的:深入解析Spring核心功能与应用实践
      • 2. 背景介绍
        • 2.1 Java EE的问题与挑战
        • 2.2 Spring的诞生与发展
        • 2.3 Spring生态体系概览
      • 3. Spring核心容器
        • 3.1 IoC(控制反转)
        • 3.2 DI(依赖注入)
        • 3.3 AOP(面向切面编程)
      • 4. Spring MVC框架
        • 4.1 MVC设计模式回顾
        • 4.2 Spring MVC组件
        • 4.3 RESTful Web服务实现
      • 5. Spring Data
        • 5.1 ORM与JPA简介
        • 5.2 Spring Data JPA的使用
        • 5.3 实体类和Repository的配合
      • 6. Spring Security
        • 6.1 安全框架概述
        • 6.2 Spring Security核心特性
        • 6.3 安全配置实战
      • 7. Spring Boot
        • 7.1 微服务与快速开发
        • 7.2 自动配置与Starter POMs
        • 7.3 Actuator与监控
      • 8. 结论
        • 8.1 总结Spring框架的核心价值
        • 8.2 展望Spring在未来软件开发中的作用

1. 引言

在软件开发的世界里,Java 语言一直以其稳健和强大著称,而 Java EE(Java Enterprise Edition)作为企业级应用开发的标杆,却随着时间的流逝,逐渐暴露出了它的局限性。想象一下,你正驾驶着一艘巨轮,在浩瀚的大海中航行。这艘巨轮虽然坚固,但随着航程的增加,你开始发现它变得越来越难以操控,维护成本高昂,而且难以快速响应海上的变化。这就是 Java EE 在面对快速迭代和敏捷开发需求时所面临的挑战。

然而,在2002年,一个名为 Rod Johnson 的程序员,就像是那位带来变革的船长,他引领着一群开发者,打造了一艘全新的帆船——Spring 框架。这艘帆船以其轻巧、灵活和易于操控的特性,迅速在 Java 开发者中流行开来。

文章的目的,就是要带你深入了解这艘帆船的构造,探索它的每一个角落,从船底的 IoC 容器到桅杆上的 AOP 帆布,再到 Spring MVC 的船舵,我们将一一解析。不仅如此,我们还要学习如何驾驶这艘帆船,让它在软件开发的海洋中乘风破浪。

1.1 简述Spring框架的起源与重要性

Spring 框架的诞生,可以说是 Java 企业级开发领域的一次革命。在它出现之前,开发者们常常被复杂的配置和笨重的代码结构所困扰。Spring 通过引入控制反转(IoC)和依赖注入(DI),极大地简化了组件的创建和管理,让开发者能够更专注于业务逻辑的实现。

1.2 阐述文章目的:深入解析Spring核心功能与应用实践

我们的文章将像一位经验丰富的舵手,带你深入 Spring 的每一个核心功能,并结合实际的应用场景,展示如何将这些功能应用到项目开发中。我们将从 Spring 的基础概念讲起,逐步深入到 Spring MVC、Spring Data、Spring Security 等高级特性,最终帮助你构建一个既安全又高效的企业级应用。

通过这篇文章,你不仅会了解到 Spring 的历史和重要性,还会掌握如何利用 Spring 框架的强大功能,来构建和维护现代化的 Java 应用。准备好了吗?让我们一起扬帆起航,探索 Spring 的奥秘吧!

在这里插入图片描述

2. 背景介绍

2.1 Java EE的问题与挑战

在软件开发的海洋中,Java EE 曾经是一艘巨轮,它为大型企业级应用提供了强大的动力和稳定性。但是,随着时间的推移,这艘巨轮开始显得笨重,难以适应快速变化的市场需求。Java EE 的配置复杂、启动缓慢、依赖管理繁琐,这些缺点就像是巨轮上的铁锚,让它难以轻盈地航行。

想象一下,作为一名船长,你想要调整航向,却发现需要经过一系列复杂的操作,而且每次调整都需要耗费大量的时间和资源。这就是 Java EE 开发者在面对快速迭代和敏捷开发时所遇到的问题。

2.2 Spring的诞生与发展

在这样的背景下,Spring 框架应运而生。它像一股清新的海风,为 Java EE 的世界带来了变革。Spring 的创始人 Rod Johnson 在《Expert One-on-One J2EE Design and Development》一书中首次提出了 Spring 的概念,这本书就像是航海图,为开发者指明了前进的方向。

Spring 通过引入控制反转(IoC)和依赖注入(DI)等概念,极大地简化了企业级应用的开发。它让开发者能够以声明式的方式管理组件,减少了配置的复杂性,提高了代码的可维护性。随着 Spring 的不断发展,它逐渐成为了 Java 企业级开发的事实标准。

2.3 Spring生态体系概览

Spring 框架的成功,催生了一个庞大的生态系统。这个生态系统就像是一片繁茂的热带雨林,其中包含了各种各样的模块和项目,它们共同构成了 Spring 的生态体系。

  • 核心容器:这是 Spring 生态系统的基础,提供了 IoC 和 DI 功能,是整个框架的心脏。
  • Spring MVC:作为 Spring 的 Web 框架,它实现了 MVC 设计模式,为开发者提供了一种简洁的方式来构建 Web 应用。
  • Spring Data:这个模块简化了数据库访问层的开发,通过 Repository 接口和方法命名规则,让数据访问变得简单而强大。
  • Spring Security:提供了一套全面的安全解决方案,帮助开发者保护 Web 应用免受攻击。
  • Spring Boot:这是 Spring 生态系统中的一股清流,它通过自动配置和 Starter POMs,进一步简化了 Spring 应用的搭建和部署。

这些模块和项目相互协作,共同构建了一个强大而灵活的软件开发平台。它们就像是船上的各个部件,每个部件都有其独特的功能,但又能协同工作,让整艘船能够高效地航行。

在这里插入图片描述

3. Spring核心容器

3.1 IoC(控制反转)

想象一下,你是一位园丁,你的任务是种植各种植物。在传统的Java EE世界里,你每次想要种植一种新的植物,都需要自己亲自去挖坑、浇水、施肥。这就像是你需要自己创建和管理每一个对象,控制它们的生命周期。但是,如果你有了一位助手,这位助手会帮你完成所有的这些工作,你只需要告诉它你想要种植什么植物,它就会帮你打理好一切。这位助手,就是 Spring 框架中的 IoC 容器。

IoC基本概念与优势
IoC,即控制反转,是一种设计原则,它将对象的创建和依赖关系的管理从对象本身转移到了专门的容器中。这样做的好处是显而易见的:

  1. 解耦:对象不再需要知道如何创建它们的依赖,这使得代码更加模块化,易于维护。
  2. 可测试性:由于对象的依赖是外部注入的,你可以很容易地替换这些依赖来进行单元测试。
  3. 灵活性:IoC 容器可以根据配置动态地创建对象,这使得应用更容易适应变化。

Bean的定义与管理
在 Spring 中,所有的对象都被称为 Bean。你可以通过 XML 配置文件、注解或 Java 配置来定义 Bean。下面是一个使用注解定义 Bean 的例子:

@Component
public class MyComponent {
    public MyComponent() {
        System.out.println("MyComponent is created!");
    }
    // ...
}

当你的 Spring 应用启动时,IoC 容器会自动扫描并创建所有标记为 @Component 的类。这个过程就像是你的助手在花园里自动种植植物一样。

3.2 DI(依赖注入)

现在,让我们来聊聊 IoC 的好兄弟——DI,也就是依赖注入。如果说 IoC 是关于“谁负责创建对象”,那么 DI 就是关于“如何将对象的依赖关系传递给它们”。

DI模式及其类型
DI 有几种不同的实现方式:

  1. 构造器注入:通过类的构造器将依赖传递给它。
  2. setter 注入:通过 setter 方法将依赖设置给对象。
  3. 字段注入:直接在对象的字段上注入依赖。

Spring 支持所有这些方式,但是通常推荐使用构造器注入,因为它可以确保对象在构造后总是处于一个有效状态。

自动装配与手动装配
Spring 允许你通过注解来指定自动装配的策略,例如 @Autowired。下面是一个自动装配的例子:

@Service
public class MyService {
    @Autowired
    private MyComponent myComponent;
    
    // ...
}

在这个例子中,Spring 会尝试自动将 MyComponent 的实例注入到 MyService 中。如果容器中存在多个 MyComponent 的实例,你可以通过指定 @Autowired 的参数来明确指出你想要注入哪一个。

3.3 AOP(面向切面编程)

现在,让我们转向 Spring 的另一个强大特性——AOP,即面向切面编程。

AOP原理与应用场景
AOP 是一种编程范式,它允许你将横切关注点(如日志记录、安全性、事务管理等)与业务逻辑分离。这就像是在你的花园里安装了一个自动喷水系统,无论种植什么植物,喷水系统都会自动工作,而你不需要为每种植物编写单独的浇水代码。

切面、通知与织入
在 AOP 中,切面 是包含横切关注点的模块,通知 是切面中的一个具体行为,而织入 是将通知应用到目标对象的过程。

下面是一个使用 Spring AOP 的简单例子:

@Aspect
@Component
public class LoggingAspect {
    @Before("execution(* com.example.service.*.*(..))")
    public void logBefore(JoinPoint joinPoint) {
        System.out.println("Before method: " + joinPoint.getSignature().getName());
    }
    // ...
}

在这个例子中,我们定义了一个切面 LoggingAspect,它在任何 com.example.service 包下的类的方法执行之前都会打印一条日志。


通过第3点的介绍,我们了解了 Spring 核心容器的三大支柱:IoC、DI 和 AOP。这些概念可能听起来有些抽象,但它们是 Spring 框架的基石,为构建灵活、可维护的应用程序提供了强大的支持。接下来,我们将探索 Spring MVC 框架,看看它是如何帮助我们构建 Web 应用的。

4. Spring MVC框架

4.1 MVC设计模式回顾

在软件开发的世界里,MVC(Model-View-Controller)就像是三剑客,它们共同协作,让应用的架构变得清晰而高效。Model 负责数据和业务逻辑,View 负责展示数据,而 Controller 则作为中介,处理用户请求并调用 Model 和 View。

想象一下,你正在观看一场精彩的戏剧。Model 就像是后台的工作人员,负责准备道具和服装;View 就像是舞台上的演员,将故事呈现给观众;Controller 则像是导演,根据观众的反应指导演员如何表演。这就是 MVC 的魅力所在,它让复杂的任务变得井井有条。

4.2 Spring MVC组件

Spring MVC 是 Spring 框架中的 Web 应用模块,它实现了 MVC 设计模式。在 Spring MVC 中,有几个关键的组件:

  • DispatcherServlet:作为前端控制器,它是整个流程的起点。当用户发起请求时,DispatcherServlet 会接收请求并将其委派给相应的 Controller 处理。
  • Controller:负责处理用户的请求。在 Controller 中,你可以编写处理特定请求的方法。
  • ViewResolver:负责解析视图。一旦 Controller 处理完请求,它会返回一个视图名称,ViewResolver 会根据这个名称找到并渲染相应的视图。

下面是一个简单的 Spring MVC Controller 示例:

@Controller
public class MyController {

    @GetMapping("/hello")
    public String sayHello(Model model) {
        model.addAttribute("message", "Hello, Spring MVC!");
        return "hello"; // 视图名称
    }
}

在这个例子中,我们定义了一个 MyController,它有一个处理 GET 请求的方法 sayHello。当用户访问 /hello 路径时,Spring MVC 会调用这个方法。方法中的 Model 参数用于向视图传递数据,而 return "hello"; 指定了视图的名称。

4.3 RESTful Web服务实现

在当今的 Web 开发中,RESTful Web 服务变得越来越流行。REST(Representational State Transfer)是一种软件架构风格,它使用标准的 HTTP 方法来处理资源。

Spring MVC 为实现 RESTful Web 服务提供了强大的支持:

  • 请求映射:你可以使用 @RequestMapping 或其特定的 HTTP 方法映射注解(如 @GetMapping@PostMapping 等)来映射 HTTP 请求到相应的 Controller 方法。
  • 数据绑定:Spring MVC 可以自动将请求参数绑定到 Java 对象上,这极大地简化了数据的处理。
  • 响应处理:你可以自由地构造响应体,返回 JSON、XML 或其他格式的数据。

下面是一个 RESTful Web 服务的例子:

@RestController
@RequestMapping("/users")
public class UserController {

    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        // 假设我们根据 ID 查找用户
        User user = userRepository.findById(id);
        return user;
    }
}

在这个例子中,我们定义了一个 UserController,它有一个 getUserById 方法来处理 GET 请求。@RequestMapping("/users") 指定了基础的 URL 路径,而 @GetMapping("/{id}") 则将路径中的 id 参数映射到方法的参数上。User 对象将被自动转换为 JSON 格式的响应体。

在这里插入图片描述

5. Spring Data

5.1 ORM与JPA简介

在软件开发的花园中,ORM(Object-Relational Mapping)就像是一把神奇的铲子,它能让你轻松地在对象世界和关系数据库世界之间挖掘和转换。而JPA(Java Persistence API)则是这把铲子的标准使用手册,它为Java开发者提供了一种规范,来操作关系数据库。

想象一下,你是一位园丁,你的花园里种满了各种植物,每种植物都有自己独特的生长周期和需求。ORM和JPA就是帮助你了解每种植物特性的工具,让你可以更高效地照料它们。

5.2 Spring Data JPA的使用

Spring Data JPA 是 Spring Data 项目的一部分,它提供了一种更加简洁的方式来使用 JPA。通过 Spring Data JPA,你不需要编写大量的样板代码,就可以实现数据的增删改查。

  • Repository接口:Spring Data JPA 允许你通过扩展 JpaRepository 接口来创建 Repository。这个接口可以自动提供一些基本的数据库操作,如保存、删除、查找等。

  • 方法命名规则:Spring Data JPA 支持一种强大的方法命名规则,通过方法名,你可以定义复杂的查询而无需编写 SQL。

  • 查询方法的自动实现:Spring Data JPA 会根据你的方法名自动生成查询,这意味着你只需要关注方法的声明,而不需要编写实现。

下面是一个使用 Spring Data JPA 的例子:

public interface UserRepository extends JpaRepository<User, Long> {
    // 根据用户名查找用户
    User findByUsername(String username);

    // 使用方法命名规则定义查询,查询所有年龄大于20的用户
    List<User> findByAgeGreaterThan(int age);
}

在这个例子中,UserRepository 继承了 JpaRepository 接口,自动获得了一些基本的数据库操作。我们还定义了两个方法,一个是简单的根据用户名查找用户的查询,另一个是通过方法命名规则定义的查询,它会查找所有年龄大于指定值的用户。

5.3 实体类和Repository的配合

在 Spring Data JPA 中,实体类(如 User)与 Repository 紧密配合,形成了数据访问的完美组合。

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

    // 省略构造器、getter和setter方法
}

在这个例子中,User 是一个实体类,它使用 JPA 注解来标识它是一个数据库表的映射。@Entity 表示这是一个实体类,@Id 表示这是实体的主键,而 @GeneratedValue 指定了主键的生成策略。

通过这样的配合,你可以轻松地在应用程序中进行数据的持久化操作,而无需关心底层的数据库细节。

6. Spring Security

6.1 安全框架概述

在软件开发的战场上,安全问题就像是那些看不见的敌人,它们悄无声息地威胁着你的应用程序。Spring Security 就是你的盾牌和利剑,它为你提供了全面的安全解决方案,帮助你抵御这些潜在的攻击。

想象一下,你是一位中世纪城堡的守卫,你的任务是保护城堡免受入侵者的侵害。Spring Security 就像是你的铠甲和武器,它让你能够识别朋友和敌人,确保只有授权的人员才能进入城堡。

6.2 Spring Security核心特性

Spring Security 的核心特性包括认证(Authentication)、授权(Authorization)和保护 Web 资源(Web Security)。

  • 认证:确定用户是谁的过程。Spring Security 支持多种认证方式,如表单登录、HTTP 基本认证、OAuth 等。

  • 授权:确定用户可以访问哪些资源的过程。一旦用户通过认证,Spring Security 会根据用户的角色和权限来限制其对资源的访问。

  • 保护 Web 资源:Spring Security 提供了对 Web 资源的细粒度控制,你可以定义哪些 URL 可以被匿名用户访问,哪些需要特定的角色或权限。

6.3 安全配置实战

让我们通过一个简单的例子来了解如何使用 Spring Security 来保护你的 Web 应用。

首先,你需要在你的 Spring Boot 应用中添加 Spring Security 的依赖,并创建一个配置类来启用 Spring Security。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/").permitAll()  // 允许所有用户访问首页
                .anyRequest().authenticated()   // 其他所有请求都需要认证
                .and()
            .formLogin()                         // 启用表单登录
                .and()
            .httpBasic();                       // 启用 HTTP 基本认证
    }
}

在这个配置类中,我们重写了 configure 方法来定义安全策略。我们允许所有用户访问根 URL /,而其他所有请求都需要用户进行认证。我们还启用了表单登录和 HTTP 基本认证。

接下来,你可以定义登录页面和登录成功的页面,以及登录失败的处理。

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        // ... 省略其他配置
        .formLogin()
            .loginPage("/login")              // 指定登录页面的 URL
            .permitAll()                       // 允许所有用户访问登录页面
            .and()
        .loginPage("/login?error")           // 指定登录失败后的 URL
        .defaultSuccessUrl("/home")           // 登录成功后重定向到的 URL
        .permitAll();
}

在这个例子中,我们指定了登录页面的 URL 为 /login,并且允许所有用户访问这个页面。我们还定义了登录失败后的 URL 格式,以及登录成功后的重定向 URL。
在这里插入图片描述

7. Spring Boot

7.1 微服务与快速开发

在软件开发的宇宙中,微服务就像是一群独立的小行星,它们各自独立运行,又相互协作,共同构成了一个庞大的星系。Spring Boot 就是一艘宇宙飞船,它让你能够快速地在这些小行星之间穿梭,开发和部署微服务变得前所未有的简单和快速。

想象一下,你是一位星际飞船的船长,你的任务是在各个星球之间快速地运送物资。Spring Boot 为你提供了强大的推进器和自动化的导航系统,让你能够轻松地抵达目的地。

7.2 自动配置与Starter POMs

在传统的 Spring 应用中,配置是一件繁琐的事情。你需要编写大量的 XML 文件或 Java 配置类,还要管理一大堆依赖。但是,Spring Boot 的出现改变了这一切。

  • 自动配置:Spring Boot 能够根据你添加的依赖自动配置应用。例如,如果你添加了 spring-boot-starter-web 依赖,Spring Boot 就会自动配置 Tomcat 和 Spring MVC。

  • Starter POMs:Spring Boot 提供了一系列的 Starter POMs,它们是预配置的 Maven 或 Gradle 依赖描述符,包含了构建特定功能所需的所有依赖。

下面是一个使用 Spring Boot Starter POM 的例子:

<!-- 在 Maven 的 pom.xml 文件中添加 -->
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- 添加其他需要的依赖 -->
</dependencies>

在这个例子中,我们只需要添加一个依赖,Spring Boot 就会自动添加并管理所有相关的库。

7.3 Actuator与监控

在星际航行中,飞船的状态监控是非常重要的。同样,在软件开发中,应用的监控和健康管理也是非常关键的。

Spring Boot Actuator 提供了一系列的监控和管理功能:

  • 应用信息:提供应用的基本信息,如配置、环境、健康状况等。
  • 日志记录:允许你远程查看和配置应用的日志。
  • 度量指标:提供应用的性能指标,如内存使用情况、请求处理时间等。

下面是一个启用 Spring Boot Actuator 的例子:

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

// 在 application.properties 文件中添加 Actuator 的配置
management.endpoints.web.exposure.include=health,metrics,info

在这个例子中,我们通过添加一些简单的配置,就启用了 Spring Boot Actuator。现在,我们可以通过访问特定的端点来获取应用的监控信息。

8. 结论

8.1 总结Spring框架的核心价值

Spring 框架就像是软件开发世界的瑞士军刀,它多功能、强大且用途广泛。从 IoC 和 DI 到 AOP,从 Spring MVC 到 Spring Data,再到 Spring Security 和 Spring Boot,Spring 框架提供了一整套工具,帮助你构建可靠、安全且易于维护的应用程序。

灵活性:Spring 允许你以声明式的方式配置应用,使得代码更加模块化,易于理解和维护。

简化开发:通过自动配置和 Starter POMs,Spring Boot 极大地简化了新应用的搭建和现有应用的升级。

安全性:Spring Security 提供了强大的安全特性,帮助你保护应用免受各种威胁。

生态系统:Spring 生态系统庞大而丰富,无论你需要什么功能,几乎都能在 Spring 生态中找到相应的支持。

8.2 展望Spring在未来软件开发中的作用

随着技术的发展,软件开发的领域也在不断扩展。从微服务到云原生应用,从物联网到机器学习,Spring 框架都在不断地进化,以适应这些新的需求。

微服务架构:Spring Cloud 提供了一系列工具来简化分布式系统的开发,使得使用 Spring 构建微服务变得更加容易。

响应式编程:Spring Framework 5 引入了对响应式编程的支持,这将帮助开发者构建更高效、更可伸缩的应用程序。

云原生应用:随着云计算的普及,Spring Boot 与云平台的集成也越来越紧密,使得部署和运维云原生应用变得更加简单。

持续创新:Spring 社区一直在不断地创新,引入新的特性和改进,确保 Spring 框架能够适应未来的技术趋势。

想象一下,未来的软件开发就像是在星际间航行,而 Spring 框架就是你的宇宙飞船,它将带你探索新的世界,征服未知的领域。


好了,到这,我们对 Spring 框架的全面详解告一段落。Spring 框架不仅仅是一套工具,它是一种哲学,一种让软件开发变得更加简单、高效和安全的方法。无论你是刚开始学习 Spring 的新手,还是已经在使用 Spring 构建复杂系统的老手,Spring 总有新的东西可以学习,总有新的方法可以探索。让我们一起期待 Spring 框架在未来软件开发中的新篇章吧!

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

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

相关文章

Attention Sink

论文发现自回归LLM存在的一个有趣现象&#xff1a;对于输入文本最靠前的少量几个token&#xff0c;无论它们在语义上与语言建模任务的相关性如何&#xff0c;大量的注意力分数都会分配给他们&#xff0c;如下图所示&#xff1a; 模型的前两层还能保持attention score更多分配给…

Angular入门

Angular版本&#xff1a;Angular 版本演进史概述-天翼云开发者社区 - 天翼云 安装nodejs&#xff1a;Node.js安装与配置环境 v20.13.1(LTS)-CSDN博客 Angular CLI是啥 Angular CLI 是一个命令行接口(Angular Command Line Interface)&#xff0c;是开发 Angular 应用的最快、最…

C++/Qt 小知识记录6

工作中遇到的一些小问题&#xff0c;总结的小知识记录&#xff1a;C/Qt 小知识6 dumpbin工具查看库导出符号OSGEarth使用编出的protobuf库&#xff0c;报错问题解决VS2022使用cpl模板后&#xff0c;提示会乱码的修改设置QProcess调用cmd.exe执行脚本QPainterPath对线段描边处理…

python实现幸运大转盘 python实现抽奖

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.代码 三.使用 四.总结 一.前言 幸运大转盘是一种活动形式,广泛应用于各种场合,如商业促销、展览活动、企业庆典以及体育课堂等,旨在增加活动的趣味性和参与度。以下是对幸运大转盘的详细介

STM32实现1.8寸液晶屏 LCD SPI串口显示屏模块 TFT彩屏(标准库和HAL库实现)

目录 一、所选模块 液晶模块选择&#xff08;淘宝上均有售卖&#xff09; 模块引脚 二、嵌入式单片机型号 三、接线表设计 四、开发环境版本说明 五、标准库实现 六、HAL库实现 七、完整工程&#xff08;内含标准库和HAL库源码&#xff09; 代码链接 一、所选模块 液…

什么是卷积神经网络

在机器视觉和其他很多问题上&#xff0c;卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;取得了当前最好的效果&#xff0c;被广泛用于各个领域&#xff0c;在很多问题上都取得了当前最好的性能。 卷积神经网络原理 卷积神经网络发展历史中…

开源免费的定时任务管理系统:Gocron

Gocron&#xff1a;精准调度未来&#xff0c;你的全能定时任务管理工具&#xff01;- 精选真开源&#xff0c;释放新价值。 概览 Gocron是github上一个开源免费的定时任务管理系统。它使用Go语言开发&#xff0c;是一个轻量级定时任务集中调度和管理系统&#xff0c;用于替代L…

14.CAS原理

文章目录 CAS原理1.什么是CAS2.Unsafe类中的CAS方法2.1.获取UnSafe实例2.2.调用UnSafe提供的CAS方法2.3.调用Unsafe提供的偏移量相关2.4.CAS无锁编程2.4.1.使用cas进行无锁安全自增案例 CAS原理 由于JVM的synchronized重量级锁设计操作系统内核态下的互斥锁的使用&#xff0c;其…

多剖面土壤墒情监测仪

TH-GTS04在农业生产中&#xff0c;土壤墒情是影响作物生长的关键因素之一。为了更好地了解土壤的水分状况&#xff0c;为农业生产提供科学依据&#xff0c;多剖面土壤墒情监测仪应运而生。这种先进的监测设备具有多项功能优势&#xff0c;为土壤水分的精准监测提供了有力支持。…

火绒安全原理、用法、案例和注意事项

火绒安全是一款功能强大的安全软件&#xff0c;它采用了先进的安全技术和算法&#xff0c;通过实时监测、恶意代码识别、防火墙功能、沙箱技术和网络保护等多种手段&#xff0c;为用户提供全面的计算机安全防护。 1.为什么选用火绒安全&#xff1f; 火绒安全是一款优秀的安全软…

通过内网穿透实现远程访问个人电脑资源详细过程(免费)(NatApp + Tomcat)

目录 1. 什么是内网穿透 2. 内网穿透软件 3. NatApp配置 4. 启动NatApp 5. 通过内网穿透免费部署我们的springboot项目 通过内网穿透可以实现远程通过网络访问电脑的资源&#xff0c;本文主要讲述通过内网穿透实现远程访问个人电脑静态资源的访问&#xff0c;下一章节将讲…

实验10配置 IPv4 和 IPv6 静态和 默认路由(课内实验)

上面这个是实验描述 下面是给的实验图 接下来我们跟着实验一步一步进行下去 第 1 部分&#xff1a;配置 IPv4 静态和 浮动静态默认路由配置ipv4静态路由&#xff1a;配置 IPv4静态和 浮动静态默认路由 步骤 1&#xff1a;配置一条 IPv4 静态 默认路由。在 Edge_Router 上&am…

Leetcode经典题目之用队列实现栈

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 目录 1、题目展示2、题目分析3、完整代码演示4、结语 1、题目展示 前面我们了解过如何实现队列…

使用 Flask Blueprint 实现模块化 Web 应用

文章目录 1. 什么是 Flask Blueprint&#xff1f;2. 为什么要使用 Flask Blueprint&#xff1f;3. 如何使用 Flask Blueprint&#xff1f;4. 在 Blueprint 之间进行通信5. 结合 Flask 插件系统进行功能拓展结语 当构建大型 Flask Web 应用时&#xff0c;保持代码的组织结构清晰…

深度缓冲技术在AI去衣中的神奇作用

引言&#xff1a; 随着人工智能技术的飞速发展&#xff0c;其在图形处理和视觉领域的应用日益增多。AI去衣技术便是其中一个颇具争议但又技术上引人入胜的话题。今天&#xff0c;我们将深入探讨一项关键技术——深度缓冲&#xff08;Depth Buffering&#xff09;&#xff0c;它…

Ubuntu 24 换国内源及原理 (阿里源 清华源 中科大源 网易源)

备份原文件 sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak 编辑源文件 sudo gedit /etc/apt/sources.list.d/ubuntu.sources 粘贴到文本&#xff08;其中一个即可&#xff09;&#xff1a; &#xff08;阿里源&#xff09…

HTML静态网页成品作业(HTML+CSS+JS)——华为商城网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;使用Javacsript代码实现首页图片切换轮播效果&#xff0c;共有1个页面…

SQL-递归查询

运行环境&#xff1a; Mysql8以上&#xff0c;递归查询功能在8以上版本被正式引入 一、SQL递归查询的概念 递归指的是通过调用函数或过程或自身来解决问题的方法&#xff0c;常用于一些具有规律性循环的操作。SQL递归查询是基于一组初始数据&#xff0c;通过递归查询&#xf…

Tableau学习2.0版——复习

官网下载链接&#xff1a;https://www.tableau.com/zh-cn/support/releases 学生账户申请链接&#xff1a;https://www.tableau.com/zh-cn/academic/students。直接去学信网下载学籍在线验证作为申请证明。 目录 1、可视化原理 2、基础图表制作 2.1 对比分析&#xff08;比…

【持续更新中,图像分割数据集】字节发布 COCONut 入选 CVPR 2024,立即体验 Segment Anything 分割万物!|持续更新中!

随着计算机视觉技术的不断发展&#xff0c;图像分割在诸多领域展现出重要的应用价值。近年来&#xff0c;各种图像分割数据集如雨后春笋般涌现。上个月&#xff0c;字节跳动发布了首个大规模全景图像分割数据集「COCONut」&#xff0c;为这一领域的研究注入了新鲜血液。 HyperA…