深入探索Spring Boot:原理与实践
Spring Boot作为一个简化Spring应用开发的框架,近年来在Java开发者中备受推崇。它通过提供默认配置、自动化配置和一系列开箱即用的功能,极大地简化了应用程序的开发和部署过程。在本篇文章中,我们将深入探讨Spring Boot的工作原理,从基本概念到高级特性,帮助你全面了解并掌握Spring Boot的使用和原理。
目录
- Spring Boot简介 - Spring Boot的背景与发展
- Spring Boot的核心理念
 
- Spring Boot的基本原理 - 自动配置(Auto-configuration)
- Spring Boot启动过程
- 条件注解(Conditional Annotations)
 
- Spring Boot的配置 - 配置文件(application.properties和application.yml)
- 外部化配置(Externalized Configuration)
- 配置属性(Configuration Properties)
 
- Spring Boot的Web开发 - 内嵌服务器(Embedded Server)
- Spring MVC与Spring Boot
- RESTful API开发
 
- 数据访问与持久化 - Spring Data JPA
- 数据库连接与配置
- 事务管理
 
- Spring Boot的安全机制 - Spring Security集成
- 常见安全配置
- OAuth2与JWT
 
- Spring Boot的监控与管理 - Spring Boot Actuator
- 健康检查与指标监控
- 自定义监控端点
 
- Spring Boot的测试 - 单元测试与集成测试
- Mock与测试数据
- Spring Boot Test框架
 
- Spring Boot的微服务架构 - Spring Cloud与Spring Boot
- 服务发现与注册
- 分布式配置与断路器
 
- 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的核心理念可以概括为以下几点:
- 自动配置:Spring Boot根据项目中的依赖和环境,自动配置Spring应用程序。开发者只需引入相应的依赖,Spring Boot就能自动配置好相关的Bean和服务。
- 起步依赖(Starter Dependencies):Spring Boot提供了一系列起步依赖,如spring-boot-starter-web、spring-boot-starter-data-jpa等,开发者可以通过引入这些依赖快速开始开发特定类型的应用。
- 嵌入式服务器:Spring Boot支持嵌入式服务器,如Tomcat、Jetty和Undertow,开发者无需再单独配置和部署应用服务器。
- 生产就绪:Spring Boot提供了一系列生产环境下常用的功能,如监控、度量、外部化配置等,帮助开发者快速构建生产级应用。
- 简化部署: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的启动过程可以分为以下几个步骤:
- 创建SpringApplication实例:在SpringApplication.run方法中,首先会创建一个SpringApplication实例。这个实例会解析配置、初始化Spring上下文、注册监听器等。
- 准备Environment:Spring Boot会准备一个Environment实例,用于持有应用的配置属性。这个实例会解析application.properties或application.yml文件中的配置,以及系统环境变量和命令行参数。
- 创建并刷新ApplicationContext:Spring Boot会根据应用类型(如Web应用或非Web应用)创建相应的ApplicationContext实例,并刷新上下文,加载所有的Bean定义。
- 调用Runner:如果应用中定义了CommandLineRunner或ApplicationRunner接口的实现类,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.properties和application.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属性
- ServletConfig和- ServletContext初始化参数
- 自定义配置源
例如,可以通过命令行参数覆盖配置:
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.properties或application.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-server和spring-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:
-  安装Elastic Beanstalk CLI。 
-  初始化Elastic Beanstalk应用: eb init
-  创建并部署应用: 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应用开发的框架,近年来在Java开发者中备受推崇。它通过提供默认配置、自动化配置和一系列开箱即用的功能,极大地简化了应用程序的开发和部署过程。在本篇文章中,我们将深入探讨Spring Boot的工作原理࿰…...
 
基于SSM框架的电影院售票网站
开头语: 你好呀,我是计算机学长猫哥!如果您对我们的电影院售票网站感兴趣或者有相关需求,欢迎通过文末的联系方式与我联系。 开发语言:Java 数据库:MySQL 技术:SSM框架 工具:ID…...
 
oracle发送http请求
UTL_HTTP包让SQL和PLSQL能够调用超文本传输协议(HTTP),也就是说可以使用它在Internet上访问数据。 当包用HTTPS从Web site获取数据时,要使用Oracle Wallet,它是由Oracle Wallet Manager或者orapki utility创建。非HTT…...
软件回归测试:策略及案例分析
软件回归测试:策略及案例分析 回归测试的定义回归测试的执行阶段回归测试的种类回归测试的策略结论 回归测试的定义 回归测试是一种质量保障措施,其主要目的是验证在进行修改、增加新功能或修复错误后,系统的原有功能仍然能够正常工作&#…...
 
openstack搭建
openstack搭建 1、虚拟机部署规划 主机主机名IP规划实例通讯内部通讯控制节点controller192.168.10.144192.168.1.144实例节点compute192.168.10.145192.168.1.145 2、硬件配置 主机名内存逻辑CPU数量硬盘容量controller4G480Gcompute4G480G20G 3、安装centos7,…...
HIVE及SparkSQL优化经验
简介 针对高耗跑批时间长的作业,在公司近3个月做过一个优化专项;优化成效:综合cpu、内存、跑批耗时减少均在65%以上; cpu和内存消耗指的是:vcoreseconds和memoryseconds 这里简单说下优化的一些思路,至于…...
 
Django 5 Web应用开发实战
文章目录 一、内容简介二、目录内容三、值得一读四、适读人群 一、内容简介 《Django 5 Web应用开发实战》集Django架站基础、项目实践、开发经验于一体,是一本从零基础到精通Django Web企业级开发技术的实战指南。《Django 5 Web应用开发实战》内容以Python 3.x和…...
互联网摸鱼日报(2024-06-17)
互联网摸鱼日报(2024-06-17) 36氪新闻 本周双碳大事:历年最大规模SNEC人气火热;首批CCER审定与核查机构名单出炉;特斯拉储能业务年增长率将达200%至300% 烧光百亿,离奇破产!顶级天才,让广东损失惨重 奥特…...
Docker Desktop Installer For Windows 国内下载地址
官网: Docker Desktop For Windows: https://download.docker.com/win/stable/Docker%20Desktop%20Installer.exe 通过Docker官网下载Docker Desktop安装包非常慢,而且还会下载失败。 解决方案 网盘下载: 链接:https://pan.qu…...
 
做好程序前设计
不要小看任何一道编程题目!一定一定一定要想好之后再动手!!! 带上你的草稿本!!!!!!!!!!!…...
 
SpringCloud:Feign远程调用
程序员老茶 🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 P S : 点赞是免费的,却可以让写博客的作者开心好久好久😎 📚系列专栏:Java全栈&#…...
leetcode-05-[242]有效的字母异位词[349]两个数组的交集[202]快乐数[1]两数之和
重点: 哈希表:当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。 常用数据结构: List 数组 固定大小 如26个字母,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…...
进程间的通信
管道 匿名管道 匿名管道的⽣命周期,是随进程的创建⽽建⽴,随进程的结束⽽销毁 匿名管道的创建,需要通过下⾯这个系统调⽤: int pipe(int fd[2]) 这⾥表示创建⼀个匿名管道,并返回了两个描述符,⼀个是…...
 
hadoop/hive/DBeaver启动流程
hadoop 启动 cd到指定目录下 cd /opt/module/hadoop-3.3.0/sbin/启动文件 ./start-all.shjps一下,查看显示的内容 应该显示以下内容 NameNode SecondaryNameNode DataNode ResourceManager NodeManager如果缺少namenode,那么执行 rm -rf /tmp/hadoo…...
1节18650锂电池的容量是多大,电流,电压是多大
1节标准的18650锂电池的规格通常如下: 容量: 18650锂电池的容量通常在1800mAh(毫安时)到3000mAh之间,这取决于电池的化学成分和制造商的设计。例如,许多常见的18650电池标称容量为2200mAh或2600mAh。 电流…...
 
基于GA遗传算法的多机无源定位系统GDOP优化matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于GA遗传算法的多机无源定位系统GDOP优化matlab仿真。仿真输出GDOP优化结果,遗传算法的优化收敛曲线以及三维空间坐标点。 2.测试软件版本以及运行…...
 
Linux C语言:多级指针(void指针和const)
一、多级指针 把一个指向指针变量的指针变量,称为多级指针变量对于指向处理数据的指针变量称为一级指针变量指向一级指针变量的指针变量称为二级指针变量 1、二级指针变量的说明形式 <数据类型> ** <指针名> ; 一张图理解二级指针 2、多…...
 
MicroPython+ESP32 C3开发上云
传感器PinI/O状态D412输出1开0关D513输出1开0关 概述 MicroPython是python3编程语言的精简实现,能够在资源非常有限的硬件上运行,如MCU微控制器Micropython的网络功能和计算功能很强大,有非常多的库可以使用,它为嵌入式开发带来了…...
 
动态 SQL
动态 SQL 是 MyBatis 的强大特性之一,能够完成不同条件下不同的 sql 拼接。也就是说执行的 SQL 语句并不是固定的,而是不同人的不同操作执行的语句会有所差异。MyBatis 通过使用 标签 的方式来实现这种灵活性的。 <if>标签 例如在有一些网站进行…...
 
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
 
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
 
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
 
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
 
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
 
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
 
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
