在 Java 企业级开发领域,SpringBoot 以其 “约定优于配置” 的理念彻底革新了传统 Spring 应用的开发模式。根据 2023 年 JetBrains 开发者调查报告,超 65% 的 Java 开发者将 SpringBoot 选为 Web 开发的首选框架。其优势显著:快速启动,借助 starter 依赖一键集成主流技术栈;极简配置,自动装配机制免去 XML 配置的繁杂;生产就绪,内置健康检查、指标监控等企业级功能;生态繁荣,覆盖微服务、安全、数据访问等全场景解决方案。本文将逐步引导你搭建第一个 SpringBoot Web 应用,通过实战展示核心开发流程,助力你快速掌握现代 Java Web 开发的关键范式。

一、环境准备与工程创建

(一)项目创建步骤详解

  1. 新建项目:在 IDEA 中,依次点击File -> New -> Project -> Spring Initializr

  2. 基础配置:

  • Project:选择 Maven,因其强大的依赖管理和项目构建能力,被广泛应用于 Java 项目。

  • Package name:可由系统自动生成,也可根据项目需求自定义,建议采用公司域名反转加项目名的方式,如com.example.demo ,以确保唯一性和规范性。

  1. 依赖选择:
  • 勾选Spring Web ,这是构建 Web 应用的核心模块,它整合了 Spring MVC 框架以及内嵌的 Tomcat 服务器等,为创建 RESTful 接口等 Web 开发工作提供基础支持。

  • 版本选择上,推荐使用稳定的 3.2.x 系列,尽量避免选择带有SNAPSHOT标识的版本,这类版本通常为开发中的不稳定版本,可能存在较多未修复的问题和兼容性风险。

(二)项目结构解析

项目创建完成后,其基本结构如下:

├── pom.xml # Maven依赖管理文件,用于声明项目所需的各种依赖库及其版本信息├── src│   ├── main│   │   ├── java│   │   │   └── com│   │   │       └── example│   │   │           └── demo│   │   │               └── DemoApplication.java # 主启动类,Spring Boot应用的入口│   │   └── resources│   │       ├── application.properties # 应用配置文件,可用于修改服务器端口、数据库连接等配置│   │       └── static # 存放静态资源,如CSS、JS、图片等│   └── test # 测试代码目录,用于编写单元测试、集成测试等代码

pom.xml文件在项目中至关重要,它管理着项目的依赖关系。例如,当我们添加Spring Web依赖时,pom.xml中会自动添加如下代码:

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

这段代码声明了项目对spring-boot-starter-web的依赖,Maven 会根据此配置自动下载相关的库及其依赖项。

二、第一个 REST 接口开发

(一)编写控制器类

com.example.demo包下创建HelloController.java文件,代码如下:

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController // 表明这是一个处理HTTP请求并返回JSON数据(默认)的控制器类
@RequestMapping("/api") // 定义该控制器下所有请求的统一前缀为/api
public class HelloController {@RequestMapping("/hello") // 映射HTTP GET请求到/hello路径public String sayHello(String name) {if (name == null || name.isEmpty()) {name = "World";}return "Hello, " + name + "!";}
}

在这段代码中,@RestController注解是 Spring MVC 提供的,它将类标记为一个 RESTful 风格的控制器,意味着该类中的方法返回值会直接作为 HTTP 响应体,并且默认以 JSON 格式返回(如果返回对象不是字符串等简单类型,Spring 会自动将其转换为 JSON)。@RequestMapping注解用于映射 URL 路径,这里@RequestMapping("/api")设置了控制器的基础路径,@RequestMapping("/hello")进一步细化了处理/api/hello路径的请求。sayHello方法接收一个名为name的参数,若参数为空则默认值为World,并返回拼接后的问候语。

(二)启动类解析

Spring Boot 项目的启动类通常带有@SpringBootApplication注解,以DemoApplication.java为例:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

@SpringBootApplication是一个组合注解,它包含了以下几个重要注解的功能:

  • @Configuration:标记该类为配置类,允许在类中定义@Bean方法来创建和配置 Spring 的 Bean。

  • @EnableAutoConfiguration:启用自动配置功能,Spring Boot 会根据项目的依赖和配置自动配置 Spring 应用的各种组件,例如根据spring-boot-starter-web依赖自动配置 Tomcat 服务器、Spring MVC 等相关组件。

  • @ComponentScan:自动扫描指定包及其子包下的组件(如@Component@Service@Repository@Controller等注解标记的类),并将它们注册到 Spring 容器中。

SpringApplication.run(DemoApplication.class, args)方法是 Spring Boot 应用的启动入口,它会启动 Spring 应用上下文,初始化各种自动配置的组件,加载并启动内嵌的 Tomcat 服务器(因为引入了spring-boot-starter-web依赖)等,从而使应用准备好接收和处理 HTTP 请求。

(三)启动与调试

  1. 运行方式
  • 在 IDEA 中,右键点击启动类DemoApplication ,选择Run 'DemoApplication' ,IDEA 会使用内置的 Maven 插件启动项目。

  • 通过命令行运行,首先进入项目根目录,然后执行mvn spring-boot:run命令,Maven 会下载项目所需的依赖(如果本地仓库中没有),并启动 Spring Boot 应用。

  1. 控制台监控
  • 启动过程中,观察控制台输出的日志。其中,会显示 Tomcat 服务器启动的端口信息,默认情况下是 8080 端口,如Tomcat started on port(s): 8080 (http)

  • 检查自动配置报告(也称为条件评估报告),在控制台日志中可以找到相关信息。自动配置报告详细列出了 Spring Boot 自动配置的各个组件以及配置的条件是否满足等信息,有助于排查自动配置过程中可能出现的问题。例如,如果某个组件没有按照预期进行配置,可以查看报告中该组件对应的条件是否未满足,从而找到问题所在。在运行时,建议优先选择 Debug 模式启动,这样在项目出现问题时,能够更方便地进行调试,跟踪代码的执行流程,查看变量的值等。当项目成功运行后,IDEA 控制台会显示 Spring 的标识和版本信息,表明 Spring Boot 应用已成功启动。

三、接口测试与验证

(一)浏览器测试

最简单的测试方式是使用浏览器。假设应用启动在默认的 8080 端口,在浏览器地址栏输入http://localhost:8080/api/hello?name=Bob ,浏览器会发送一个 HTTP GET 请求到/api/hello路径,并携带参数name=Bob 。服务器接收到请求后,由HelloControllersayHello方法处理,返回Hello, Bob!的结果,并显示在浏览器页面上。这种方式适用于简单的接口测试,能够直观地看到接口返回的结果。

(二)Postman 高级测试

Postman 是一款功能强大的 API 测试工具,可用于更全面地测试接口。

  1. GET 请求测试
  • Method:选择 GET,表示发送 HTTP GET 请求。

  • URL:输入http://localhost:8080/api/hello ,若需要携带参数,可在 URL 后添加,如http://localhost:8080/api/hello?name=Alice 。点击发送按钮,Postman 会显示接口返回的结果,包括状态码(如 200 表示请求成功)、响应头和响应体等信息。通过 Postman,可以方便地查看接口返回的数据格式是否正确,以及测试不同参数组合下接口的表现。

  1. POST 请求示例(扩展)

    假设我们有一个创建用户的接口,控制器代码如下:

@RestController
@RequestMapping("/users")
public class UserController {@PostMappingpublic User createUser(@RequestBody User user) {// 这里调用业务逻辑层保存用户,假设userService已正确注入return userService.save(user);}
}

在 Postman 中测试该 POST 接口时:

  • Method:选择 POST。

  • URL:输入http://localhost:8080/users

  • Body:选择raw ,并将数据格式设置为 JSON(因为@RequestBody注解通常用于接收 JSON 格式的数据),然后在文本框中输入用户数据,例如{"username":"testUser","password":"123456"} 。点击发送按钮后,Postman 会将这些数据以 HTTP POST 请求的方式发送到服务器,服务器接收到请求后,会将 JSON 数据转换为User对象,并由createUser方法处理,返回创建后的用户对象信息(如果保存成功)。通过 Postman 的这种方式,可以方便地测试需要传递复杂数据结构的接口,如创建用户、提交订单等涉及多个字段的接口。

四、项目配置调优

(一)修改应用配置

Spring Boot 通过application.properties文件进行应用的配置。

  1. 修改服务器端口:默认情况下,Spring Boot 应用运行在 8080 端口。若该端口已被占用或有其他需求,可以在application.properties文件中添加如下配置来修改端口:
server.port=9090

修改后,重新启动应用,应用将在 9090 端口运行。

2. 开启调试模式:在开发过程中,开启调试模式有助于查看更详细的错误信息,方便排查问题。在application.properties文件中添加:

debug=true

开启调试模式后,Spring Boot 会在控制台输出更多关于自动配置过程、Bean 的创建等详细信息,当应用出现错误时,也会显示更全面的堆栈跟踪信息,帮助开发者快速定位问题。

3. 配置 JPA(示例):若项目需要使用 JPA(Java Persistence API)进行数据库操作,以连接 MySQL 数据库为例,在application.properties文件中添加如下配置:

spring.jpa.hibernate.ddl - auto=updatespring.datasource.url=jdbc:mysql://localhost:3306/demospring.datasource.username=rootspring.datasource.password=123456

其中,spring.jpa.hibernate.ddl - auto=update表示 Hibernate 会根据实体类的定义自动更新数据库表结构(开发环境常用,生产环境需谨慎使用,避免数据丢失)。spring.datasource.url指定了数据库的连接地址,spring.datasource.usernamespring.datasource.password分别是数据库的用户名和密码。通过这些配置,Spring Boot 能够自动配置 JPA 相关组件,连接到 MySQL 数据库,并进行数据持久化操作。

(二)常用开发技巧

  1. 热部署:开发过程中,每次修改代码都需要重启应用是一件繁琐的事情。Spring Boot 提供了spring-boot-devtools依赖来实现热部署功能。在pom.xml文件中添加如下依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional>
</dependency>

添加依赖后,当修改 Java 类、配置文件等资源时,应用会自动重启(比手动重启快很多),无需手动停止和启动应用。同时,对于 HTML、CSS、JS 等静态资源的修改,无需重启应用即可直接生效,大大提高了开发效率。

2. 跨域配置:当前端应用和后端 Spring Boot 应用部署在不同的域名或端口下时,会出现跨域问题。Spring Boot 可以通过@CrossOrigin注解方便地解决跨域问题。在控制器类或方法上添加该注解,例如:

@RestController@RequestMapping("/api")@CrossOrigin(origins = "http://localhost:3000") // 允许来自http://localhost:3000的跨域请求public class HelloController {//...}

上述代码中,@CrossOrigin(origins = "``http://localhost:3000``")表示允许来自http://localhost:3000这个源的跨域请求。如果需要允许所有源的跨域请求,可以使用@CrossOrigin(origins = "*") ,但在生产环境中,出于安全考虑,不建议这样使用,应尽量明确指定允许的源。

3. 接口文档:为了方便团队协作和接口的维护,生成接口文档是很有必要的。Spring Boot 可以集成 Swagger3(基于 OpenAPI 规范)来自动生成接口文档。首先,在pom.xml文件中添加 Swagger3 的依赖:

<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>3.0.0</version>
</dependency>
<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>3.0.0</version>
</dependency>

然后,创建一个 Swagger 的配置类,例如:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;@Configuration
@EnableSwagger2
public class SwaggerConfig {@Beanpublic Docket api() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select().apis(RequestHandlerSelectors.basePackage("com.example.demo")).paths(PathSelectors.any()).build();}private ApiInfo apiInfo() {return new ApiInfoBuilder().title("Spring Boot API Documentation").description("This is the API documentation for the Spring Boot application").version("1.0").build();}
}

配置完成后,启动应用,访问http://localhost:8080/swagger-ui.html (假设应用运行在 8080 端口),即可看到自动生成的接口文档,文档中详细列出了各个接口的路径、请求方法、参数、返回值等信息,方便开发人员查看和使用。

五、最佳实践建议

(一)分层架构

遵循 Controller - Service - DAO 分层架构是良好的开发实践。

  • Controller 层:负责接收 HTTP 请求,进行参数校验、数据格式转换等工作,并调用 Service 层的业务逻辑方法。例如在HelloController中,接收/api/hello的请求,并将请求参数传递给业务逻辑处理(虽然这里业务逻辑简单,只是返回固定格式的问候语)。

  • Service 层:主要处理业务逻辑,例如用户注册时的密码加密、数据校验、调用 DAO 层进行数据持久化操作等。它将业务逻辑封装成一个个服务方法,供 Controller 层调用,提高代码的复用性和可维护性。

  • DAO 层:负责与数据库进行交互,执行数据库的增删改查操作。例如在使用 JPA 时,通过定义Repository接口来实现对数据库表的操作。采用分层架构可以使代码结构更加清晰,各层职责单一,便于团队协作开发和代码的维护与扩展。例如,当数据库操作方式发生变化时,只需修改 DAO 层的代码,而不会影响到 Controller 层和 Service 层的业务逻辑。

(二)统一响应

封装标准的 Response 对象有助于统一接口的返回格式,提高接口的可读性和可维护性。通常,Response 对象包含状态码、消息和数据三个部分。例如,定义一个通用的 Response 类:

public class Response<T> {private int code; // 状态码,如200表示成功,500表示服务器内部错误private String message; // 响应消息,用于描述操作结果private T data; // 响应数据,根据接口返回的具体数据类型而定public Response(int code, String message, T data) {this.code = code;this.message = message;this.data = data;}// 省略getter和setter方法
}

在控制器方法中返回统一格式的 Response 对象,例如:

@RestController
@RequestMapping("/api")
public class HelloController {@RequestMapping("/hello")public Response<String> say Hello(String name) {​String result = "Hello, " + (name == null || name.isEmpty() ? "World" : name) + "!";​return new Response<>(200, "success", result);​
}​
}

这样,无论接口成功还是失败,返回的数据格式都保持一致,前端在处理响应时也能更统一、高效。例如,当接口调用成功时,返回状态码 200 和对应的数据;当出现错误时,返回相应的错误状态码和错误信息,前端可以根据状态码快速判断接口调用情况并进行相应处理。

(三)异常处理

在项目开发中,合理的异常处理能够提高应用的健壮性和用户体验。Spring Boot 提供了 @ControllerAdvice@ExceptionHandler 注解来实现全局异常处理。

首先,创建一个全局异常处理类:

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;@ControllerAdvice // 标识该类为全局异常处理类
public class GlobalExceptionHandler {// 处理空指针异常@ExceptionHandler(NullPointerException.class)@ResponseBody // 将返回结果转换为JSON格式public Response<String> handleNullPointerException(NullPointerException e) {return new Response<>(500, "发生空指针异常:" + e.getMessage(), null);}// 处理其他未捕获的异常@ExceptionHandler(Exception.class)@ResponseBodypublic Response<String> handleException(Exception e) {return new Response<>(500, "发生未知异常:" + e.getMessage(), null);}
}

当应用中抛出 NullPointerException 或其他未被捕获的异常时,全局异常处理类会捕获这些异常,并返回统一格式的错误响应。例如,当代码中出现空指针异常时,会返回状态码 500 和具体的异常信息,方便开发者排查问题,同时也能给前端一个清晰的错误提示,而不是展示晦涩的异常堆栈信息。

(四)代码规范

良好的代码规范有助于提高代码的可读性和可维护性,便于团队协作开发。以下是一些常见的代码规范建议:

  1. 命名规范
  • 类名使用帕斯卡命名法(PascalCase),即每个单词的首字母都大写,如 HelloControllerUserService

  • 方法名、变量名使用驼峰命名法(camelCase),即第一个单词的首字母小写,后续单词的首字母大写,如 sayHellouserName

  • 常量名全部大写,单词之间用下划线分隔,如 MAX_AGEDEFAULT_PAGE_SIZE

  1. 代码格式
  • 合理使用缩进,通常使用 4 个空格作为缩进单位,使代码结构清晰。

  • 在运算符前后、逗号后添加空格,如 int a = 1 + 2;List<String> list = new ArrayList<>();

  • 每行代码不宜过长,建议不超过 80 个字符,当代码过长时进行换行处理。

  1. 注释规范
  • 为类、方法、重要的变量添加注释,说明其功能、参数、返回值等信息。

  • 使用 /** */ 为类和方法添加文档注释,使用 // 为单行代码添加注释。例如:

/*** 问候控制器,处理与问候相关的HTTP请求*/
@RestController
@RequestMapping("/api")
public class HelloController {/*** 生成问候语* @param name 问候的对象名称,可为空* @return 包含问候语的统一响应对象*/@RequestMapping("/hello")public Response<String> sayHello(String name) {// 处理name为空的情况,默认使用"World"String result = "Hello, " + (name == null || name.isEmpty() ? "World" : name) + "!";return new Response<>(200, "success", result);}
}

六、总结与展望

通过本文的学习,我们从零开始搭建了一个简单的 Spring Boot Web 应用,了解了项目的创建、REST 接口的开发、接口测试、项目配置调优以及一些最佳实践建议。Spring Boot 以其简洁、高效的特点,极大地简化了 Java Web 应用的开发流程,让开发者能够更专注于业务逻辑的实现。

在实际开发中,随着项目的复杂度增加,我们还可以进一步学习 Spring Boot 的其他功能,如数据访问(整合 MyBatis、JPA 等)、安全认证(Spring Security)、缓存(Redis)、消息队列(RabbitMQ、Kafka)等,不断扩展应用的功能和性能。

希望本文能够帮助你快速入门 Spring Boot Web 开发,为后续的学习和实践打下坚实的基础。在开发过程中,多动手实践、多查阅官方文档和相关资料,不断积累经验,你会发现 Spring Boot 开发的乐趣和魅力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/919856.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/919856.shtml
英文地址,请注明出处:http://en.pswp.cn/news/919856.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手持 Mid360 + RealSense 相机 + Jetson Orin 一体平台

这篇博客是我们开源的一个项目介绍&#xff0c;包括3D结构件 STP 文件与常见 SLAM 工程在 Arm 设备上编译手册等&#xff0c;将 Livox Mid360、Realsense 相机、Nvidia Jetson Orin、定制电池放在了一个手持设备上&#xff0c;同时这个手持设备预留了底部螺纹孔&#xff0c;当你…

H7-TOOL固件2.31发布,支持250M示波器,支持IAR下载算法加载运行,上位机支持UTF-8编码,增加多款脱机烧录芯片支持

【PC软件】V2.3.1 1. 脱机烧录功能更新: - 添加芯片: - 自动填充文件名、Flash地址、Flash大小、SRAM地址和SRAM大小 - FLM算法文件不支持自动填写文件名&#xff0c;当生成文件后需要手动更新 - 厂商列表栏鼠标右键菜单可复制厂商名 - 修复添加芯片排列次序的问题…

自然语言处理——06 迁移学习(上)

1 fasttext工具介绍 1.1 介绍 fasttext 是 Facebook AI Research&#xff08;FAIR&#xff09;开发的开源 NLP 工具包&#xff0c;专门用来解决文本相关任务&#xff0c;比如情感分析、文本分类&#xff08;判断新闻属于体育/财经等&#xff09;、识别“人名/地名”这类实体&a…

数据库MVCC是什么

问题数据库MVCC是什么我的回答MVCC&#xff0c;全称是"多版本并发控制"(Multi-Version Concurrency Control)&#xff0c;是数据库管理系统中常用的一种并发控制技术。说白了&#xff0c;它就是通过维护数据的多个版本&#xff0c;让读操作不会被写操作阻塞&#xff…

游戏广告投放数据分析项目:拆解投放的“流量密码”

用数据说话&#xff1a;1441条投放记录拆解游戏广告投放的“流量密码”一、数据概况 & 处理思路 先放一张数据全家福&#xff0c;字段 13 个&#xff0c;样本 1441 条&#xff0c;缺失值 0&#xff0c;只做了一件事&#xff1a;把“未知大小”“无”等脏数据清洗掉。 impor…

数据库服务语句应用

文章目录&#x1f31f;数据库语句应用介绍&#x1f340;数据库语句分类介绍DDL&#xff08;Data Definition Language&#xff09;数据定义语言DCL&#xff08;Data Control Language&#xff09;数据控制语言DML&#xff08;Data Manipulation Language&#xff09;数据操作语…

解释器模式与布尔表达式的C++实现

详细探讨一下解释器模式(Interpreter Pattern)以及如何使用它来实现一个简单的布尔表达式求值器。 第一部分:解释器模式详解 1. 模式定义与意图 解释器模式是一种行为设计模式,它给定一个语言,定义其文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中…

ELK 重难点解析以及最佳实践

ELK 重难点解析以及最佳实践 目录 ELK简介核心组件详解使用技巧重难点解析Spring Boot集成具体场景使用最佳实践 ELK简介 什么是ELK ELK是一个开源的日志分析平台&#xff0c;由三个核心组件组成&#xff1a; Elasticsearch: 分布式搜索引擎&#xff0c;用于存储和检索日…

【PyTorch】单对象分割项目

对象分割是在图像中找到目标对象的边界的过程。单目标分割的重点是自动勾勒出图像中一个目标对象的边界。对象边界通常由二进制掩码定义。 通过二进制掩码&#xff0c;可以在图像上覆盖轮廓以勾勒出对象边界。例如以下图片描绘了胎儿的超声图像、胎儿头部的二进制掩码以及覆盖在…

esp dl

放下了好多年 又回到了dl 该忘的也忘的差不多了 其实没啥复杂的 只是不习惯 熟悉而已 好吧 现代的人工智能体 还是存在着很大的问题 眼睛 耳朵 思考 虽然功能是正常的 但距离&#xff02;真正&#xff02;(&#xff09;意思上的独立意识个体 还是差别很大 再等个几十年 看看…

基于django/python的服装销售系统平台/服装购物系统/基于django/python的服装商城

基于django/python的服装销售系统平台/服装购物系统/基于django/python的服装商城

详解ThreadLocal<HttpServletRequest> requestThreadLocal

public static ThreadLocal<HttpServletRequest> requestThreadLocal ThreadLocal.withInitial(() -> null);一、代码逐部分详解 1. public static public&#xff1a;表示这个变量是公开的&#xff0c;其他类可以访问。static&#xff1a;表示这是类变量&#xff0c…

Vue2 响应式系统设计原理与实现

文章目录Vue2 响应式系统设计原理与实现Vue2 响应式系统设计原理与实现 Vue2 的响应式原理主要基于以下几点&#xff1a; 使用 Object.defineProperty () 方法对数据对象的属性进行劫持 当数据发生变化时&#xff0c;通知依赖该数据的视图进行更新 实现一个发布 - 订阅模式&a…

探索 JUC:Java 并发编程的神奇世界

探索 JUC&#xff1a;Java 并发编程的神奇世界 在 Java 编程领域&#xff0c;随着多核处理器的普及和应用场景复杂度的提升&#xff0c;并发编程变得愈发重要。Java 并发包&#xff08;JUC&#xff0c;Java.util.concurrent&#xff09;就像是一座宝藏库&#xff0c;为开发者提…

selenium采集数据怎么应对反爬机制?

selenium是一个非常强大的浏览器自动化工具&#xff0c;通过操作浏览器来抓取动态网页内容&#xff0c;可以很好的处理JavaScript和AJAX加载的网页。 它能支持像点击按钮、悬停元素、填写表单等各种自动化操作&#xff0c;所以很适合自动化测试和数据采集。 selenium与各种主流…

指定文件夹上的压缩图像格式tiff转换为 jpg 批量脚本

文章大纲 背景简介 代码 背景简介 随着数字成像技术在科研、医学影像和遥感等领域的广泛应用,多页TIFF(Tag Image File Format)文件因其支持多维数据存储和高位深特性,成为存储序列图像、显微镜切片或卫星遥感数据的首选格式。然而在实际应用中,这类文件存在以下显著痛点…

Docker 部署 MySQL 8.0 完整指南:从拉取镜像到配置远程访问

目录前言一、拉取镜像二、查看镜像三、运行容器命令参数说明&#xff1a;四、查看运行容器五、进入容器内部六、修改 MySQL 配置1. 创建配置文件2. 配置内容七、重启 MySQL 服务八、设置 Docker 启动时自动启动 MySQL九、再次重启 MySQL十、授权远程访问1. 进入容器内部2. 登录…

IntelliJ IDEA 常用快捷键笔记(Windows)

前言&#xff1a;特别标注的快捷键&#xff08;Windows&#xff09;快捷键功能说明Ctrl Alt M将选中代码提取成方法Ctrl Alt T包裹选中代码块&#xff08;try/catch、if、for 等&#xff09;Ctrl H查看类的继承层次Alt 7打开项目结构面板Ctrl F12打开当前文件结构视图Ct…

疏老师-python训练营-Day54Inception网络及其思考

浙大疏锦行 DAY54 一、 inception网络介绍 今天我们介绍inception&#xff0c;也就是GoogleNet 传统计算机视觉的发展史 从上面的链接&#xff0c;可以看到其实inceptionnet是在resnet之前的&#xff0c;那为什么我今天才说呢&#xff1f;因为他要引出我们后面的特征融合和…

LeetCode第3304题 - 找出第 K 个字符 I

题目 解答 class Solution {public char kthCharacter(int k) {int n 0;int v 1;while (v < k) {v << 1;n;}String target kthCharacterString(n);return target.charAt(k - 1);}public String kthCharacterString(int n) {if (n 0) {return "a";}Str…