当前位置: 首页 > 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>标签 例如在有一些网站进行…...

Qwen3-14B项目管理助手:需求文档生成、甘特图描述、风险点预判

Qwen3-14B项目管理助手&#xff1a;需求文档生成、甘特图描述、风险点预判 1. 项目管理的AI革命 项目管理是一项复杂的工作&#xff0c;涉及需求分析、进度规划、资源调配和风险控制等多个环节。传统方式下&#xff0c;项目经理需要花费大量时间编写文档、绘制甘特图和评估风…...

挖到宝!阿贝云免费云服务太香了,学生党开发者闭眼冲

做个人博客、练技术、部署轻量应用还在找高性价比云服务&#xff1f;阿贝云https://www.abeiyun.com 直接把免费做到极致&#xff0c;免费虚拟主机 免费云服务器双福利&#xff0c;用下来的体验真的远超预期&#xff0c;稳定不卡顿还免备案&#xff0c;新手操作也毫无门槛太省…...

避开这3个坑!Cortex-M3/M4使用DWT计数器时的常见错误与解决方法

Cortex-M3/M4开发实战&#xff1a;DWT计数器避坑指南与高阶应用技巧 在嵌入式系统开发中&#xff0c;精确的时间测量往往是性能优化和调试的关键。Cortex-M3/M4内核内置的DWT(Data Watchpoint and Trace)组件&#xff0c;特别是其CYCCNT计数器&#xff0c;为开发者提供了一个零…...

ISO/SAE 21434:2021(道路车辆 - 网络安全工程) 汇总

一、前言、引言&#xff08;非正文章节&#xff09;前言&#xff1a;标准制定背景、适用范围、与 ISO 26262&#xff08;功能安全&#xff09;的协同关系引言&#xff1a;网络安全对道路车辆 E/E 系统的必要性、全生命周期覆盖、风险导向原则二、正文核心章节&#xff08;1–15…...

告别手动抄表!WinCC结合SQL Server和Excel,打造车间级设备运行数据看板

工业数据可视化实战&#xff1a;用WinCCSQL Server构建车间级智能看板 在制造业数字化转型浪潮中&#xff0c;车间设备数据的可视化呈现已成为提升生产效率的关键环节。传统的人工抄表方式不仅耗时耗力&#xff0c;更难以实现数据的实时分析和历史追溯。本文将介绍如何利用Win…...

如何快速解锁网易云音乐NCM文件:ncmdumpGUI终极指南

如何快速解锁网易云音乐NCM文件&#xff1a;ncmdumpGUI终极指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 还在为网易云音乐下载的NCM格式文件无法在其他…...

MMC模块化多电平换流器Simulink仿真模型:N=10子模块的载波移相调制与多控制策略应用

MMC模块化多电平换流器&#xff0c;MMC-HVDC直流输电系统&#xff0c;单个桥臂N10个子模块&#xff0c;采用载波移相调制 simulink仿真模型。 为了测试控制性能良好&#xff0c;在1s时&#xff0c;额定有功功率10e6增加到15e6。 子模块电压2000V&#xff0c;直流电压20KV。 定有…...

基于Phi-3-mini-128k-instruct构建运维智能助手:Linux命令分析与故障排查

基于Phi-3-mini-128k-instruct构建运维智能助手&#xff1a;Linux命令分析与故障排查 1. 引言 想象一下这个场景&#xff1a;凌晨两点&#xff0c;服务器监控告警突然响起&#xff0c;CPU使用率飙升到90%&#xff0c;内存也快见底。你睡眼惺忪地登录服务器&#xff0c;面对满…...

SAP增强开发实战:如何用STARTING NEW TASK避免BAPI_TRANSACTION_COMMIT的坑?

SAP增强开发实战&#xff1a;如何用STARTING NEW TASK避免BAPI_TRANSACTION_COMMIT的坑&#xff1f; 在SAP标准增强开发中&#xff0c;当我们需要在出口函数里调用BAPI修改或创建业务单据时&#xff0c;总会遇到一个经典难题&#xff1a;如何在增强点安全地提交事务&#xff1f…...

Gemma-3-12b-it开源大模型落地:教育场景中图表解析与作业辅导应用

Gemma-3-12b-it开源大模型落地&#xff1a;教育场景中图表解析与作业辅导应用 1. 项目背景与核心价值 在教育领域&#xff0c;学生和教师经常面临图表解析和作业辅导的挑战。传统方法需要人工查阅资料或依赖专业软件&#xff0c;效率低下且成本高昂。Gemma-3-12b-it多模态交互…...