深入探索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>标签 例如在有一些网站进行…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...
算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...
相关类相关的可视化图像总结
目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系,可直观判断线性相关、非线性相关或无相关关系,点的分布密…...
