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

深入探索Spring Boot:原理与实践

Spring Boot作为一个简化Spring应用开发的框架,近年来在Java开发者中备受推崇。它通过提供默认配置、自动化配置和一系列开箱即用的功能,极大地简化了应用程序的开发和部署过程。在本篇文章中,我们将深入探讨Spring Boot的工作原理,从基本概念到高级特性,帮助你全面了解并掌握Spring Boot的使用和原理。

目录

  1. Spring Boot简介
    • Spring Boot的背景与发展
    • Spring Boot的核心理念
  2. Spring Boot的基本原理
    • 自动配置(Auto-configuration)
    • Spring Boot启动过程
    • 条件注解(Conditional Annotations)
  3. Spring Boot的配置
    • 配置文件(application.properties和application.yml)
    • 外部化配置(Externalized Configuration)
    • 配置属性(Configuration Properties)
  4. Spring Boot的Web开发
    • 内嵌服务器(Embedded Server)
    • Spring MVC与Spring Boot
    • RESTful API开发
  5. 数据访问与持久化
    • Spring Data JPA
    • 数据库连接与配置
    • 事务管理
  6. Spring Boot的安全机制
    • Spring Security集成
    • 常见安全配置
    • OAuth2与JWT
  7. Spring Boot的监控与管理
    • Spring Boot Actuator
    • 健康检查与指标监控
    • 自定义监控端点
  8. Spring Boot的测试
    • 单元测试与集成测试
    • Mock与测试数据
    • Spring Boot Test框架
  9. Spring Boot的微服务架构
    • Spring Cloud与Spring Boot
    • 服务发现与注册
    • 分布式配置与断路器
  10. Spring Boot的部署
    • 打包与构建
    • 部署到云平台
    • 容器化部署(Docker)

1. Spring Boot简介

Spring Boot的背景与发展

Spring Boot是Spring框架的子项目,旨在简化基于Spring框架的应用程序开发。Spring框架自2003年发布以来,以其强大的依赖注入(Dependency Injection)和面向切面编程(Aspect-Oriented Programming)功能,成为Java企业级开发的首选框架。然而,Spring的配置相对复杂,尤其是大型应用程序,配置文件可能会变得冗长且难以维护。

为了解决这一问题,Spring团队在2014年推出了Spring Boot。Spring Boot通过“约定优于配置”的理念,提供了一系列默认配置和自动化功能,使开发者可以更加专注于业务逻辑的实现,而无需花费大量时间在框架配置上。

Spring Boot的核心理念

Spring Boot的核心理念可以概括为以下几点:

  1. 自动配置:Spring Boot根据项目中的依赖和环境,自动配置Spring应用程序。开发者只需引入相应的依赖,Spring Boot就能自动配置好相关的Bean和服务。
  2. 起步依赖(Starter Dependencies):Spring Boot提供了一系列起步依赖,如spring-boot-starter-web、spring-boot-starter-data-jpa等,开发者可以通过引入这些依赖快速开始开发特定类型的应用。
  3. 嵌入式服务器:Spring Boot支持嵌入式服务器,如Tomcat、Jetty和Undertow,开发者无需再单独配置和部署应用服务器。
  4. 生产就绪:Spring Boot提供了一系列生产环境下常用的功能,如监控、度量、外部化配置等,帮助开发者快速构建生产级应用。
  5. 简化部署:Spring Boot应用可以打包为可执行的JAR文件或WAR文件,支持以Java应用程序的形式运行,极大地简化了部署过程。

2. Spring Boot的基本原理

自动配置(Auto-configuration)

自动配置是Spring Boot的核心功能之一。它通过分析类路径上的依赖、类和Bean定义,自动配置Spring应用的各个部分。自动配置的关键是@EnableAutoConfiguration注解,它通常被放在主类上。这个注解告诉Spring Boot根据类路径中的依赖来自动配置Spring应用程序。

Spring Boot使用一系列@Configuration类和@Conditional注解来实现自动配置。这些配置类和条件注解决定了在什么条件下应用某个配置。例如,如果类路径中存在H2数据库的依赖,Spring Boot会自动配置一个内存数据库。

自动配置的实现机制依赖于Spring Factories机制。Spring Boot在META-INF/spring.factories文件中定义了所有需要自动配置的类。启动时,Spring Boot会加载这些类并根据条件进行配置。

Spring Boot启动过程

Spring Boot的启动过程可以分为以下几个步骤:

  1. 创建SpringApplication实例:在SpringApplication.run方法中,首先会创建一个SpringApplication实例。这个实例会解析配置、初始化Spring上下文、注册监听器等。
  2. 准备Environment:Spring Boot会准备一个Environment实例,用于持有应用的配置属性。这个实例会解析application.propertiesapplication.yml文件中的配置,以及系统环境变量和命令行参数。
  3. 创建并刷新ApplicationContext:Spring Boot会根据应用类型(如Web应用或非Web应用)创建相应的ApplicationContext实例,并刷新上下文,加载所有的Bean定义。
  4. 调用Runner:如果应用中定义了CommandLineRunnerApplicationRunner接口的实现类,Spring Boot会在启动完成后调用它们。

条件注解(Conditional Annotations)

Spring Boot的自动配置依赖于一系列条件注解,如@ConditionalOnClass@ConditionalOnMissingBean@ConditionalOnProperty等。这些注解允许开发者在特定条件下才加载某些Bean或配置。例如:

  • @ConditionalOnClass:仅当类路径中存在指定的类时才加载配置。
  • @ConditionalOnMissingBean:仅当上下文中不存在指定的Bean时才加载配置。
  • @ConditionalOnProperty:仅当指定的属性存在且符合条件时才加载配置。

条件注解使得Spring Boot的配置具有很高的灵活性和可扩展性,开发者可以根据实际需求定制应用的配置。

3. Spring Boot的配置

配置文件(application.properties和application.yml)

Spring Boot支持两种格式的配置文件:application.propertiesapplication.yml。这两个文件通常放在src/main/resources目录下。以下是一个application.properties文件的示例:

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

相应的application.yml文件可以这样写:

server:port: 8080spring:datasource:url: jdbc:mysql://localhost:3306/testusername: rootpassword: secret

外部化配置(Externalized Configuration)

Spring Boot允许将配置外部化,以便在不同的环境中使用相同的代码。除了默认的配置文件外,Spring Boot还支持从以下位置加载配置:

  • 命令行参数
  • Java系统属性
  • 操作系统环境变量
  • JNDI属性
  • ServletConfigServletContext初始化参数
  • 自定义配置源

例如,可以通过命令行参数覆盖配置:

java -jar myapp.jar --server.port=9090

配置属性(Configuration Properties)

Spring Boot提供了@ConfigurationProperties注解,用于将配置文件中的属性映射到Java对象中。这种方式使得配置管理更加方便和类型安全。以下是一个示例:

首先定义一个配置类:

@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceProperties {private String url;private String username;private String password;// getters and setters
}

然后在主类或配置类中启用这个配置:

@EnableConfigurationProperties(DataSourceProperties.class)
public class Application {// ...
}

4. Spring Boot的Web开发

内嵌服务器(Embedded Server)

Spring Boot支持内嵌的Tomcat、Jetty和Undertow服务器。默认情况下,Spring Boot使用Tomcat作为内嵌服务器。内嵌服务器的优点是开发和部署更加简单,无需在外部安装和配置服务器。

可以通过application.properties文件配置内嵌服务器的参数,例如:

server.port=8081
server.servlet.context-path=/app

Spring MVC与Spring Boot

Spring Boot默认集成了Spring MVC,开发者可以直接使用Spring MVC的所有特性来构建Web应用。以下是一个简单的控制器示例:

@RestController
public class HelloController {@GetMapping("/hello")public String sayHello() {return "Hello, World!";}
}

Spring Boot中,通常不需要显式配置DispatcherServlet或视图解析器,Spring Boot会自动进行配置。

RESTful API开发

Spring Boot非常适合构建RESTful API。可以使用@RestController和各种注解来定义API端点。例如:

@RestController
@RequestMapping("/api")
public class UserController {@GetMapping("/users")public List<User> getAllUsers() {return userService.findAll();}@PostMapping("/users")public User createUser(@RequestBody User user) {return userService.save(user);}@GetMapping("/users/{id}")public User getUserById(@PathVariable Long id) {return userService.findById(id);}@PutMapping("/users/{id}")public User updateUser(@PathVariable Long id, @RequestBody User userDetails) {return userService.update(id, userDetails);}@DeleteMapping("/users/{id}")public void deleteUser(@PathVariable Long id) {userService.delete(id);}
}

5. 数据访问与持久化

Spring Data JPA

Spring Boot与Spring Data JPA无缝集成,使得数据访问层的开发变得更加简单和高效。以下是一个基本的JPA实体和仓库(Repository)定义:

@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;private String email;// getters and setters
}public interface UserRepository extends JpaRepository<User, Long> {
}

在服务类中可以直接注入UserRepository并使用:

@Service
public class UserService {@Autowiredprivate UserRepository userRepository;public List<User> findAll() {return userRepository.findAll();}public User save(User user) {return userRepository.save(user);}public User findById(Long id) {return userRepository.findById(id).orElse(null);}public User update(Long id, User userDetails) {User user = userRepository.findById(id).orElseThrow();user.setName(userDetails.getName());user.setEmail(userDetails.getEmail());return userRepository.save(user);}public void delete(Long id) {userRepository.deleteById(id);}
}

数据库连接与配置

Spring Boot通过自动配置简化了数据库连接的配置。在application.propertiesapplication.yml文件中配置数据库连接信息即可:

spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=secret
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

事务管理

Spring Boot支持声明式事务管理,可以通过@Transactional注解轻松实现事务控制。例如:

@Service
public class UserService {@Autowiredprivate UserRepository userRepository;@Transactionalpublic User updateUser(Long id, User userDetails) {User user = userRepository.findById(id).orElseThrow();user.setName(userDetails.getName());user.setEmail(userDetails.getEmail());return userRepository.save(user);}
}

6. Spring Boot的安全机制

Spring Security集成

Spring Boot与Spring Security紧密集成,为Web应用提供了强大的安全保护。可以通过引入spring-boot-starter-security依赖来启用Spring Security。例如:

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

然后配置一个简单的安全配置类:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/public/**").permitAll().anyRequest().authenticated().and().formLogin().loginPage("/login").permitAll().and().logout().permitAll();}@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().withUser("user").password(passwordEncoder().encode("password")).roles("USER");}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
}

常见安全配置

Spring Boot的安全配置非常灵活,可以通过application.properties文件进行一些常见的安全配置。例如:

spring.security.user.name=admin
spring.security.user.password=admin123
spring.security.user.roles=USER,ADMIN

OAuth2与JWT

Spring Boot还支持OAuth2和JWT认证。可以通过引入spring-boot-starter-oauth2-resource-serverspring-boot-starter-oauth2-client依赖来启用OAuth2支持。以下是一个OAuth2资源服务器配置示例:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/public/**").permitAll().anyRequest().authenticated().and().oauth2ResourceServer().jwt();}
}

application.properties文件中配置JWT相关参数:

spring.security.oauth2.resourceserver.jwt.jwk-set-uri=https://example.com/.well-known/jwks.json

7. Spring Boot的监控与管理

Spring Boot Actuator

Spring Boot Actuator提供了一系列用于监控和管理Spring Boot应用的端点。这些端点可以用于查看应用的健康状况、环境信息、度量指标等。可以通过引入spring-boot-starter-actuator依赖来启用Actuator功能:

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

application.properties文件中配置Actuator端点的访问权限:

management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always

健康检查与指标监控

Actuator提供了一个/health端点,用于检查应用的健康状况。可以通过实现HealthIndicator接口来自定义健康检查。例如:

@Component
public class CustomHealthIndicator implements HealthIndicator {@Overridepublic Health health() {boolean healthy = checkSomeService();if (healthy) {return Health.up().withDetail("service", "available").build();} else {return Health.down().withDetail("service", "unavailable").build();}}private boolean checkSomeService() {// 自定义健康检查逻辑return true;}
}

自定义监控端点

可以通过实现@Endpoint注解来自定义Actuator端点。例如:

@Endpoint(id = "custom")
@Component
public class CustomEndpoint {@ReadOperationpublic Map<String, Object> customEndpoint() {Map<String, Object> details = new HashMap<>();details.put("custom", "This is a custom endpoint");return details;}
}

8. Spring Boot的测试

单元测试与集成测试

Spring Boot提供了强大的测试支持,可以通过引入spring-boot-starter-test依赖来启用测试功能。以下是一个简单的单元测试示例:

@SpringBootTest
public class UserServiceTests {@Autowiredprivate UserService userService;@Testpublic void testFindAll() {List<User> users = userService.findAll();assertNotNull(users);}
}

Mock与测试数据

可以使用@MockBean注解来创建Mock对象,并注入到测试上下文中。例如:

@SpringBootTest
public class UserServiceTests {@MockBeanprivate UserRepository userRepository;@Autowiredprivate UserService userService;@Testpublic void testFindAll() {when(userRepository.findAll()).thenReturn(Collections.emptyList());List<User> users = userService.findAll();assertTrue(users.isEmpty());}
}

Spring Boot Test框架

Spring Boot提供了@SpringBootTest注解,用于在测试中启动整个Spring应用上下文。还提供了其他一些注解,如@WebMvcTest@DataJpaTest等,用于特定场景的测试。例如:

@WebMvcTest
public class UserControllerTests {@Autowiredprivate MockMvc mockMvc;@Testpublic void testGetAllUsers() throws Exception {mockMvc.perform(get("/api/users")).andExpect(status().isOk()).andExpect(content().contentType(MediaType.APPLICATION_JSON));}
}

9. Spring Boot的微服务架构

Spring Cloud与Spring Boot

Spring Cloud与Spring Boot紧密集成,为构建微服务架构提供了一系列解决方案,如服务发现、分布式配置、断路器等。可以通过引

入Spring Cloud相关依赖来启用这些功能。

例如,使用Eureka进行服务发现:

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

在应用主类上添加@EnableEurekaClient注解:

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

服务发现与注册

application.properties文件中配置Eureka客户端:

eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
spring.application.name=my-service

分布式配置与断路器

使用Spring Cloud Config进行分布式配置管理:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-client</artifactId>
</dependency>

application.properties文件中配置Config客户端:

spring.cloud.config.uri=http://localhost:8888

使用Hystrix实现断路器:

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

在应用主类上添加@EnableHystrix注解:

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

定义一个使用断路器的服务方法:

@Service
public class UserService {@HystrixCommand(fallbackMethod = "fallbackMethod")public String getUserById(String id) {// 调用远程服务}public String fallbackMethod(String id) {return "Fallback response";}
}

10. Spring Boot的部署

打包与构建

Spring Boot应用可以打包为可执行的JAR文件或WAR文件。可以使用Maven或Gradle进行构建。例如,使用Maven打包:

mvn clean package

生成的JAR文件可以直接运行:

java -jar target/myapp.jar

部署到云平台

Spring Boot应用可以部署到各种云平台,如AWS、Google Cloud、Azure等。例如,部署到AWS Elastic Beanstalk:

  1. 安装Elastic Beanstalk CLI。

  2. 初始化Elastic Beanstalk应用:

    eb init
    
  3. 创建并部署应用:

    eb create
    eb deploy
    

容器化部署(Docker)

Spring Boot应用可以轻松容器化并部署到Docker。以下是一个简单的Dockerfile示例:

FROM openjdk:11-jre-slim
VOLUME /tmp
COPY target/myapp.jar myapp.jar
ENTRYPOINT ["java","-jar","/myapp.jar"]

构建Docker镜像:

docker build -t myapp .

运行Docker容器:

docker run -p 8080:8080 myapp

结论

Spring Boot通过简化配置、自动化配置和提供开箱即用的功能,使得构建Spring应用变得更加简单和高效。通过深入理解Spring Boot的工作原理和实践,开发者可以更加灵活地使用Spring Boot构建高性能、可维护的企业级应用。本篇文章详细介绍了Spring Boot的各个方面,希望能够帮助你更好地掌握和应用Spring Boot。

相关文章:

深入探索Spring Boot:原理与实践

Spring Boot作为一个简化Spring应用开发的框架&#xff0c;近年来在Java开发者中备受推崇。它通过提供默认配置、自动化配置和一系列开箱即用的功能&#xff0c;极大地简化了应用程序的开发和部署过程。在本篇文章中&#xff0c;我们将深入探讨Spring Boot的工作原理&#xff0…...

基于SSM框架的电影院售票网站

开头语&#xff1a; 你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果您对我们的电影院售票网站感兴趣或者有相关需求&#xff0c;欢迎通过文末的联系方式与我联系。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM框架 工具&#xff1a;ID…...

oracle发送http请求

UTL_HTTP包让SQL和PLSQL能够调用超文本传输协议&#xff08;HTTP&#xff09;&#xff0c;也就是说可以使用它在Internet上访问数据。 当包用HTTPS从Web site获取数据时&#xff0c;要使用Oracle Wallet&#xff0c;它是由Oracle Wallet Manager或者orapki utility创建。非HTT…...

软件回归测试:策略及案例分析

软件回归测试&#xff1a;策略及案例分析 回归测试的定义回归测试的执行阶段回归测试的种类回归测试的策略结论 回归测试的定义 回归测试是一种质量保障措施&#xff0c;其主要目的是验证在进行修改、增加新功能或修复错误后&#xff0c;系统的原有功能仍然能够正常工作&#…...

openstack搭建

openstack搭建 1、虚拟机部署规划 主机主机名IP规划实例通讯内部通讯控制节点controller192.168.10.144192.168.1.144实例节点compute192.168.10.145192.168.1.145 2、硬件配置 主机名内存逻辑CPU数量硬盘容量controller4G480Gcompute4G480G20G 3、安装centos7&#xff0c…...

HIVE及SparkSQL优化经验

简介 针对高耗跑批时间长的作业&#xff0c;在公司近3个月做过一个优化专项&#xff1b;优化成效&#xff1a;综合cpu、内存、跑批耗时减少均在65%以上&#xff1b; cpu和内存消耗指的是&#xff1a;vcoreseconds和memoryseconds 这里简单说下优化的一些思路&#xff0c;至于…...

Django 5 Web应用开发实战

文章目录 一、内容简介二、目录内容三、值得一读四、适读人群 一、内容简介 《Django 5 Web应用开发实战》集Django架站基础、项目实践、开发经验于一体&#xff0c;是一本从零基础到精通Django Web企业级开发技术的实战指南。《Django 5 Web应用开发实战》内容以Python 3.x和…...

互联网摸鱼日报(2024-06-17)

互联网摸鱼日报(2024-06-17) 36氪新闻 本周双碳大事&#xff1a;历年最大规模SNEC人气火热&#xff1b;首批CCER审定与核查机构名单出炉&#xff1b;特斯拉储能业务年增长率将达200%至300% 烧光百亿&#xff0c;离奇破产&#xff01;顶级天才&#xff0c;让广东损失惨重 奥特…...

Docker Desktop Installer For Windows 国内下载地址

官网&#xff1a; Docker Desktop For Windows: https://download.docker.com/win/stable/Docker%20Desktop%20Installer.exe 通过Docker官网下载Docker Desktop安装包非常慢&#xff0c;而且还会下载失败。 解决方案 网盘下载&#xff1a; 链接&#xff1a;https://pan.qu…...

做好程序前设计

不要小看任何一道编程题目&#xff01;一定一定一定要想好之后再动手&#xff01;&#xff01;&#xff01; 带上你的草稿本&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xf…...

SpringCloud:Feign远程调用

程序员老茶 &#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; P   S : 点赞是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#…...

leetcode-05-[242]有效的字母异位词[349]两个数组的交集[202]快乐数[1]两数之和

重点&#xff1a; 哈希表&#xff1a;当我们遇到了要快速判断一个元素是否出现集合里的时候&#xff0c;就要考虑哈希法。 常用数据结构&#xff1a; List 数组 固定大小 如26个字母&#xff0c;10个数字 空间换时间 Set hashset 去重 Map hashmap <K,V>形式 …...

C语言实现动态栈

#include<stdio.h> #include<stdlib.h> #include<stdbool.h>// 每一个节点的数据类型 typedef struct Node {int data;struct Node * pNext; }NODE, * PNODE; // NODE等价 struct Node PNODE等价于 struct Node *// 栈 typedef struct Stack {PNODE pTop;P…...

进程间的通信

管道 匿名管道 匿名管道的⽣命周期&#xff0c;是随进程的创建⽽建⽴&#xff0c;随进程的结束⽽销毁 匿名管道的创建&#xff0c;需要通过下⾯这个系统调⽤&#xff1a; int pipe(int fd[2]) 这⾥表示创建⼀个匿名管道&#xff0c;并返回了两个描述符&#xff0c;⼀个是…...

hadoop/hive/DBeaver启动流程

hadoop 启动 cd到指定目录下 cd /opt/module/hadoop-3.3.0/sbin/启动文件 ./start-all.shjps一下&#xff0c;查看显示的内容 应该显示以下内容 NameNode SecondaryNameNode DataNode ResourceManager NodeManager如果缺少namenode&#xff0c;那么执行 rm -rf /tmp/hadoo…...

1节18650锂电池的容量是多大,电流,电压是多大

1节标准的18650锂电池的规格通常如下&#xff1a; 容量&#xff1a; 18650锂电池的容量通常在1800mAh&#xff08;毫安时&#xff09;到3000mAh之间&#xff0c;这取决于电池的化学成分和制造商的设计。例如&#xff0c;许多常见的18650电池标称容量为2200mAh或2600mAh。 电流…...

基于GA遗传算法的多机无源定位系统GDOP优化matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于GA遗传算法的多机无源定位系统GDOP优化matlab仿真。仿真输出GDOP优化结果&#xff0c;遗传算法的优化收敛曲线以及三维空间坐标点。 2.测试软件版本以及运行…...

Linux C语言:多级指针(void指针和const)

一、多级指针 把一个指向指针变量的指针变量&#xff0c;称为多级指针变量对于指向处理数据的指针变量称为一级指针变量指向一级指针变量的指针变量称为二级指针变量 1、二级指针变量的说明形式 <数据类型> ** <指针名> &#xff1b; 一张图理解二级指针 2、多…...

MicroPython+ESP32 C3开发上云

传感器PinI/O状态D412输出1开0关D513输出1开0关 概述 MicroPython是python3编程语言的精简实现&#xff0c;能够在资源非常有限的硬件上运行&#xff0c;如MCU微控制器Micropython的网络功能和计算功能很强大&#xff0c;有非常多的库可以使用&#xff0c;它为嵌入式开发带来了…...

动态 SQL

动态 SQL 是 MyBatis 的强大特性之一&#xff0c;能够完成不同条件下不同的 sql 拼接。也就是说执行的 SQL 语句并不是固定的&#xff0c;而是不同人的不同操作执行的语句会有所差异。MyBatis 通过使用 标签 的方式来实现这种灵活性的。 <if>标签 例如在有一些网站进行…...

功能强大的多功能文档转换工具Neevia Document Converter Pro 7.5.0.241

Neevia Document Converter Pro是一款功能强大的Windows软件,旨在将文档转换为各种格式,包括PDF、TIFF、JPEG和许多其他格式。该程序专为在企业环境中使用而设计,提供文档转换和处理过程的自动化,这使其成为处理大量文档的组织的***工具。 Neevia Document Converter Pro的…...

从零到一,深入浅出大语言模型的奇妙世界

2022 年底&#xff0c;OpenAI 发布的 ChatGPT 模型在全球范围内引起了巨大轰动。本文详细的介绍了大语言模型的发展历程、构建过程和大语言模型如何使用等知识&#xff0c;帮助大家搞懂大语言模型。 一、大语言模型发展历程 大模型技术并不是一蹴而就的&#xff0c;大语言模型…...

ESP8266发送WOL幻数据包实现电脑远程唤醒

计算机远程唤醒&#xff08;Wake-on-LAN, WOL&#xff09; 计算机远程唤醒&#xff08;Wake-on-LAN&#xff0c;简称 WOL&#xff09;是一种局域网唤醒技术&#xff0c;可以将局域网内处于关机或休眠状态的计算机唤醒至引导&#xff08;Boot Loader&#xff09;或运行状态。无…...

用一个ESP32S3-Zero把有线键盘变为无线

三脚猫最近一直琢磨&#xff0c;那些喜欢买剪线键盘&#xff0c;以及自制键盘瞎折腾的人都是怎么搞的。经过不懈努力&#xff0c;终于想明白除了直接的硬件一个个pin针的高低电压判断后转给蓝牙&#xff0c;拿到现成的古董剪线键盘还有一个方式其实是在usb host转发给蓝牙类似这…...

Redis 7.x 系列【3】多种连接方式

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. Redis Cli3. 可视化管理工具3.1 Redis Insight3.2 RedisDesktopManager 4. …...

数据结构(DS)C语言版:学习笔记(4):线性表

参考教材&#xff1a;数据结构C语言版&#xff08;严蔚敏&#xff0c;吴伟民编著&#xff09; 工具&#xff1a;XMind、幕布、公式编译器 正在备考&#xff0c;结合自身空闲时间&#xff0c;不定时更新&#xff0c;会在里面加入一些真题帮助理解数据结构 目录 2.1线性…...

Linux 命令大全

Linux 命令大全 Linux是一个强大的操作系统,它通过命令行界面提供了丰富的功能和灵活性。了解和掌握各种Linux命令对于系统管理员和开发者来说至关重要。本文将为您提供一个全面的Linux命令大全,帮助您更好地理解和使用Linux系统。 基础命令 ls - 列出目录内容。cd - 更改当…...

[华为北向网管NCE开发教程(6)消息订阅

1.作用 之前介绍的都是我们向网管NCE发起请求获取数据&#xff0c;消息订阅则反过来&#xff0c;是网管NCE系统给我们推送信息。其原理和MQ&#xff0c;JMS这些差不多&#xff0c;这里不过多累述。 2.场景 所支持订阅的场景有如下&#xff0c;以告警通知为例&#xff0c;当我…...

2024.6.15 英语六级 经验与复盘

文章目录 英语六级 经验与复盘2024年上半年六级考试(2024 6.8 - 6.15)前情提要&#xff1a;经验&#xff1a;作文&#xff1a;(30min)听力&#xff1a;(25min)SectionC(精细阅读) (30min)SectionB(段落匹配) (15min)SectionA(选词填空) (5min / 舍弃)翻译&#xff08;20min&…...

计算机专业的未来展望

身份角度一&#xff1a;一名曾经的计算机专业学生  作为一名曾经的计算机专业学生&#xff0c;我认为计算机相关专业仍然是一个值得考虑的选择。随着科技的飞速发展&#xff0c;计算机行业的需求只会越来越高&#xff0c;因此&#xff0c;无论是在就业前景还是个人发展方面&a…...

八方资源网做网站优化怎么样/市场营销十大经典案例

相信小伙伴们都学过斐波那契数列&#xff0c;它是这样的一个数列&#xff1a;1,1,2,3,5,8,13,21\cdots1,1,2,3,5,8,13,21⋯。 用 f_nfn​ 表示斐波那契数列的第 nn 项&#xff0c;则有&#xff1a;f_1 f_2 1f1​f2​1&#xff0c;f_n f_{n-1} f_{n-2} (n>2)fn​fn−1​f…...

购物网站开发文献综述/google推广 的效果

电脑快捷键 Ctrl A 全选 Ctrl C 复制 Ctrl P 打印 Ctrl Y 恢复 Win D 返回桌面 Win E 打开我的电脑 Win L 锁定桌面 F2 文件重命名 F5 刷新 Ctrl shift T 网页关了&#xff0c;一键重新打开...

游戏网站的导航条怎么做的/营销推广活动策划方案大全

本文译自PCL官网教程,原文链接如下 Implicit Shape Model 隐式形状模型 在这个教程中我们将学习如何使用在 pcl::ism::ImplicitShapeModel 类中实现的隐式形状模型算法.这个算法在Jan Knopp, Mukta Prasad, Geert Willems, Radu Timofte, and Luc Van Gool撰写的文章”Hough…...

建设银行卡如何网站激活/seo什么意思中文意思

1. 注意&#xff1a;如果想使用Subtitle类型的单元格&#xff0c;需在Storyboard中将Protocell设置为subtitle类型&#xff0c;且Protocell的identifier必须与ViewController中cellForRow方法设置&#xff0c;保持一致&#xff0c;才能保证在subtitle行内容被显示出来。 - (UI…...

网站设计中 查询怎么做/手机优化器

1准备工作 , 加载apicloud 海康视频模块。 引入 SDK 重新生成项目测试 再config.xml写入appid 话不多说直接上代码 videoapi.require("haikangVideo");video.open({ip:ip,port:port,channel:1,user:name,pwd:pwd,fixedOn: api.frameName,fixed: true,rect : {x : …...

新闻宣传wordpress主题/如何优化关键词提升相关度

在安装之前&#xff0c;确认你的机器安装了python,和easy_install.通常python是自动安装的&#xff0c;如果没有安装easy_install&#xff0c;那么wget -q http://peak.telecommunity.com/dist/ez_setup.py获取一下python ez_setup.pypexpect是python一个模块&#xff0c;可以通…...