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

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 {@Autowiredprivate 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 {@Overrideprotected 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 框架在未来软件开发中的新篇章吧!

相关文章:

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

带你一探 Spring Boot 的自动配置和 Starter POMs 的神奇之处&#xff0c;展示如何通过几个简单的步骤就能让你的微服务应用在云端翱翔&#xff01; 文章目录 1. 引言1.1 简述Spring框架的起源与重要性1.2 阐述文章目的&#xff1a;深入解析Spring核心功能与应用实践2. 背景介绍…...

WordPress 、Typecho 站点的 MySQL/MariaDB 数据库优化

今天明月给大家分享一下 WordPress 、Typecho 站点的 MySQL/MariaDB 数据库优化&#xff0c;无论你的站点采用是 WordPress 还是 Typecho&#xff0c;都要用到 MySQL/MariaDB 数据库&#xff0c;我们以 MySQL 为主&#xff08;MariaDB 其实跟 MySQL 基本没啥大的区别&#xff0…...

==与===的区别

在许多编程语言和脚本语言中&#xff0c;包括 JavaScript 和 PHP 等&#xff0c; 和 是用于比较值的操作符。 “” 是相等运算符&#xff0c;用于比较两个值是否相等。它比较值时会进行类型转换&#xff0c;如果两个值在类型转换后相等&#xff0c;那么它们就被认为是相等的。…...

什么是ACID及基本实现的示例

什么是ACID特性 ACID 是一个缩写词&#xff0c;代表数据库事务的四个关键特性&#xff1a;原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&#xff09;、持久性&#xff08;Durability&#xff09;。这些…...

【启明智显技术分享】SSD202核心板Rootfs下如何烧录mac地址

提示&#xff1a;作为Espressif&#xff08;乐鑫科技&#xff09;大中华区合作伙伴及sigmastar&#xff08;厦门星宸&#xff09;VAD合作伙伴&#xff0c;我们不仅用心整理了你在开发过程中可能会遇到的问题以及快速上手的简明教程供开发小伙伴参考。同时也用心整理了乐鑫及星宸…...

springboot3 集成spring-authorization-server (一 基础篇)

官方文档 Spring Authorization Server 环境介绍 java&#xff1a;17 SpringBoot&#xff1a;3.2.0 SpringCloud&#xff1a;2023.0.0 引入maven配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter…...

AVL树!

文章目录 1.AVL树的概念2.AVL树的插入和旋转3.AVL树的旋转3.1旋转的底层&#xff1a;3.2 右旋转3.3 左旋转3.4 双旋 4.AVL树的底层 1.AVL树的概念 当向二叉搜索树中插入新结点后&#xff0c;如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整)&a…...

知识付费系统怎么安装教程,教师课堂教学该掌握哪些表达技巧?

课堂教学语言表达是教学艺术的一个基本且重要的组成部分。教师向学生传道、授业、解惑以及师生之间信息的传递和情感的交流&#xff0c;都离不开运用教学语言这一有力的工具&#xff0c;在课堂上&#xff0c;教师通过情趣盎然的表述&#xff0c;鞭辟入里的分析&#xff0c;恰到…...

基于MetaGPT的LLM Agent学习实战(一)

前言 我最近一直在做基于AI Agent 的个人项目&#xff0c; 因为工作加班较多&#xff0c;设计思考时间不足&#xff0c;这里借着Datawhale的开源学习课程《MetaGPT智能体理论与实战》课程&#xff0c;来完善自己的思路&#xff0c;抛砖引玉&#xff0c;和各位开发者一起学习&am…...

【IMX6ULL项目】IMX6ULL上Linux系统实现产测工具框架

电子产品量产测试与烧写工具。这是一套软件&#xff0c;用在我们的实际生产中&#xff0c; 有如下特点&#xff1a; 1.简单易用&#xff1a; 把这套软件烧写在 SD 卡上&#xff0c;插到 IMX6ULL 板子里并启动&#xff0c;它就会自动测试各个模块、烧写 EMMC 系统。 工人只要按…...

【Linux基础】Vim保姆级一键配置教程(手把手教你把Vim打造成高效率C++开发环境)

目录 一、前言 二、安装Vim 三、原始Vim编译器的缺陷分析 四、Vim配置 &#x1f95d;预备知识----.vimrc 隐藏文件 &#x1f34b;手动配置 Vim --- &#xff08;不推荐&#xff09; &#x1f347;自动化一键配置 Vim --- (强烈推荐) ✨功能演示 五、共勉 一、前言 Vim作为…...

Gartner发布准备应对勒索软件攻击指南:勒索软件攻击的三个阶段及其防御生命周期

攻击者改变了策略&#xff0c;在某些情况下转向勒索软件。安全和风险管理领导者必须通过提高检测和预防能力来为勒索软件攻击做好准备&#xff0c;同时还要改进其事后应对策略。 主要发现 勒索软件&#xff08;无加密的数据盗窃攻击&#xff09;是攻击者越来越多地使用的策略。…...

IB 公式解析

IB损失 自我感悟 根据对决策边界的影响程度来分配权重。影响程度越大&#xff0c;分配到的权重越小&#xff1b;影响程度越小&#xff0c;分配到的权重越大。 最后其实就是平衡因子和交叉熵损失的输出的乘积 公式 3.2. Influence Function 影响函数允许我们在移除样本时估…...

开发辅助工具的缩写

开发辅助工具的缩写有很多&#xff0c;这些工具通常是为了提高软件开发效率、代码质量和团队协作效率而设计的。以下是一些常见的开发辅助工具及其缩写&#xff1a; IDE - Integrated Development Environment&#xff08;集成开发环境&#xff09; VCS - Version Control Sys…...

linux程序分析命令(一)

linux程序分析命令(一) **ldd&#xff1a;**用于打印共享库依赖。这个命令会显示出一个可执行文件所依赖的所有共享库&#xff08;动态链接库&#xff09;&#xff0c;这对于解决运行时库依赖问题非常有用。**nm&#xff1a;**用于列出对象文件的符号表。这个命令可以显示出定…...

MYSQL数据库-SQL语句

数据库相关概念 名称全称简称数据库存储数据的仓库&#xff0c;数据是有组织的进行存储DataBase(DB)数据库管理系统操纵和管理数据库的大型软件DataBase Management System(DBMS)SQL操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型数据库统一标准Structured Quer…...

MyBatis认识

一、定义 MyBatis是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff08;Plain Old Java O…...

【WEEK11】 【DAY6】Employee Management System Part 7【English Version】

2024.5.11 Saturday Continued from 【WEEK11】 【DAY5】Employee Management System Part 6【English Version】 Contents 10.8. Delete and 404 Handling10.8.1. Modify list.html10.8.2. Modify EmployeeController.java10.8.3. Restart10.8.4. 404 Page Handling10.8.4.1. …...

【52】Camunda8-Zeebe核心引擎-Clustering与流程生命周期

Clustering集群 Zeebe本质是作为一个brokers集群运行&#xff0c;形成一个点对点网络。在这个网络中&#xff0c;所有brokers的功能与服务都相同&#xff0c;没有单点故障。 Gossip协议 Zeebe实现了gossip协议&#xff0c;并借此知悉哪些broker当前是集群的一部分。 集群使用…...

从零开始的软件测试学习之旅(八)jmeter线程组参数化及函数学习

jmeter线程组参数化及函数学习 Jmeter基础基本使用流程组件与元件 线程组线程的执行方式Jmeter组件执行顺序 常见属性设置查看结果数的作用域举例 Jmeter参数化实现方式1.用户定义参数2.用户参数3.函数4.csv数据文件设置 每日复习 Jmeter基础 基本使用流程 启动项目案例 启动…...

图文并茂:解析Spring Boot Controller返回图片的三种方式

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 图文并茂&#xff1a;解析Spring Boot Controller返回图片的三种方式 前言使用Base64编码返回图片使用byte数组返回图片使用Resource对象返回图片图片格式转换与性能对比 前言 在互联网的世界里&…...

问题处理记录 | 表输出报错 Packet for query is too large (5,214,153 > 4,194,304).

这个错误是由于MySQL服务器接收到的查询数据包太大而引起的。具体来说&#xff0c;错误消息中提到的数据包大小为5,214,153字节&#xff0c;而MySQL服务器默认只接受最大为4,194,304字节的数据包。 要解决这个问题&#xff0c;你可以尝试通过修改MySQL服务器的配置来增大max_a…...

数据结构_栈和队列(Stack Queue)

✨✨所属专栏&#xff1a;数据结构✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ 栈&#xff1a; 代码&#xff1a;function/数据结构_栈/stack.c 钦某/c-language-learning - 码云 - 开源中国 (gitee.com)https://gitee.com/wang-qin928/c-language-learning/blob/master/function/…...

基于docker 的elasticsearch冷热分离及生命周期管理

文章目录 冷热集群架构的应用场景冷热集群架构的优势冷热集群架构实战搭建集群 索引生命周期管理认识索引生命周期索引生命周期管理的历史演变索引生命周期管理的基础知识Rollover&#xff1a;滚动索引 冷热集群架构的应用场景 某客户的线上业务场景如下&#xff1a;系统每天增…...

pikachu靶场(xss通关教程)

&#xff08;注&#xff1a;若复制注入代码攻击无效&#xff0c;请手动输入注入语句&#xff0c;在英文输入法下&#xff09; 反射型xss(get型) 1.打开网站 发现有个框&#xff0c;然后我们在框中输入一个“1”进行测试&#xff0c; 可以看到提交的数据在url处有显示&#xf…...

实验0.0 Visual Studio 2022安装指南

Visual Studio 2022 是一个功能强大的开发工具&#xff0c;对于计算机专业的学生来说&#xff0c;它不仅可以帮助你完成学业项目&#xff0c;还能为你将来的职业生涯打下坚实的基础。通过学习和使用 Visual Studio&#xff0c;你将能够更高效地开发软件&#xff0c;并在编程领域…...

数据结构之----线性表

线性表分为 顺序存储结构 和 链式存储结构 线性表的顺序存储结构&#xff1a; 线性表的顺序存储结构&#xff0c;指的是用一段地址连续的存储单元依次存储线性表的数据元素。 1&#xff0c;顺序表的结构&#xff1a; #define MAXSIZE 20 typedef int El…...

thinkphp5.1 模型auto

在ThinkPHP5.1中&#xff0c;模型的自动完成功能可以通过在模型类中定义auto属性来实现。这个属性是一个数组&#xff0c;包含了需要自动填充的字段和对应的处理规则。 以下是一个简单的例子&#xff0c;展示了如何在ThinkPHP5.1的模型中使用自动完成功能&#xff1a; <?…...

企业微信创建应用(一)

登录到企业微信后台管理(https://work.weixin.qq.com/)进入自建应用(应用管理-应用-创建应用) 3.查看参数AgentId和 Secret 4.企业微信查看效果...

Cosmo Bunny Girl

可爱的宇宙兔女郎的3D模型。用额外的骨骼装配到Humanoid上,Apple混合了形状。完全模块化,包括不带衣服的身体。 技术细节 内置,包括URP和HDRP PDF。还包括关于如何启用URP和HDRP的说明。 LOD 0:面:40076,tris 76694,verts 44783 装配了Humanoid。添加到Humanoid中的其他…...