使用Spring Boot快速搭建项目:减少配置,提升开发效率
使用Spring Boot快速搭建项目:减少配置,提升开发效率
- 一、Spring Boot简介
- 1 Spring Boot的起源
- 2 Spring Boot的核心特点
- 3 Spring Boot的优势
- 二、Spring Boot快速搭建项目
- 1 Spring Boot的项目搭建方式
- 使用Spring Initializr创建项目
- 使用Spring Boot CLI创建项目
- 使用Spring Boot CLI和Groovy DSL创建项目
- 2 Spring Boot项目结构介绍
- 应用主类及配置文件
- 控制器层
- 服务层
- 数据层
- Spring Boot的自动配置原理
- Spring Boot的自动配置特点
- Spring Boot自动配置的加载顺序
- 三、Spring Boot开发中的常用技术
- 1 Spring Boot的MVC架构
- 1.1 Spring Boot MVC的基本概念
- 1.2 Spring Boot MVC开发注意事项
- 2 Spring Boot整合MyBatis框架
- 2.1 Spring Boot整合MyBatis的配置方法
- 2.2 MyBatis的基本CRUD操作
- 3 Spring Boot整合Spring Security框架
- 3.1 Spring Security的安全认证机制
- 3.2 Spring Security的常用配置方法
- 四、Spring Boot项目的部署与打包
- 1 Spring Boot项目的打包方式
- 1.1 jar包的打包方式
- 1.2 war包的打包方式
- 2 Spring Boot项目的部署方法
- 2.1 传统方式的部署
- 2.2 Docker容器的部署方式
- 五、小结回顾
- 1 Spring Boot的发展趋势
- 2 Spring Boot的优缺点评价
一、Spring Boot简介
Spring Boot是一个基于Spring Framework的子项目,旨在简化Spring应用程序的初始化过程、开发过程和部署过程,并提供快速、敏捷的开发环境。Spring Boot从以下三个方面提高开发效率:
1 Spring Boot的起源
Spring Boot的推出旨在简化Spring应用程序的开发、部署及运行。它采用约定大于配置的理念默认提供了若干项目常用依赖和自动化配置,使开发者可以更简单地入门Spring以及用更少的时间和精力搭建Spring项目。
2 Spring Boot的核心特点
- 简化配置:Spring Boot采用“约定优于配置”的设计思想。
- 自动装配:Spring Boot能够根据项目的依赖信息自动配置Spring应用程序,并提供了很多功能。
- 无代码生成:Spring Boot无需任何代码生成,通过简单的配置即可生成可运行的Spring应用程序。
- 微服务:Spring Boot非常适合于构建微服务应用程序。
- 集成测试:Spring Boot支持快速集成测试,方便开发人员进行单元测试和集成测试。
3 Spring Boot的优势
- 快速启动:Spring Boot应用程序具有非常快的启动速度,同时也可以减少大量的开发时间和成本。
- 容易部署:Spring Boot应用程序可以打成jar包或者war包进行部署。
- 易于维护:Spring Boot应用程序采用配置文件的方式,易于维护。
- 开箱即用:Spring Boot提供了很多内置了许多日常开发中的功能,在很多情况下不再需要额外添加第三方依赖和插件。
- 生态系统丰富:Spring Boot生态系统非常丰富,提供了许多优秀的开源项目,如Spring Cloud、Spring Data等。
二、Spring Boot快速搭建项目
Spring Boot提供了多种项目搭建方式,在大多数情况下使用Spring Initializr创建项目是最受欢迎的。
1 Spring Boot的项目搭建方式
使用Spring Initializr创建项目
使用Spring Initializr能够简单地快速创建一个适用于Spring Boot的新项目。Spring Initializr不仅提供了Web界面和命令行工具两种方式,还提供了众多可选的配置选项。
使用Spring Boot CLI创建项目
Spring Boot CLI是一个命令行工具,可以通过命令行创建和运行Spring Boot应用程序。对于熟悉命令行且不希望通过Web界面来创建项目的开发人员,Spring Boot CLI是一个不错的选择。
使用Spring Boot CLI和Groovy DSL创建项目
Groovy DSL是一种基于Groovy语言的DSL,可以用来创建和运行Spring Boot应用程序,其极大地改进了开发人员的开发效率。
2 Spring Boot项目结构介绍
按照Spring Boot的推荐结构,主要可分为应用主类及配置文件、控制器层、服务层和数据层四个部分。
应用主类及配置文件
应用主类是Spring Boot应用程序的入口点,通过配置文件来指定数据库连接、端口等信息。
配置文件分为application.properties和application.yml格式两种,末尾的文件格式为用于表示yaml文件格式中的列表的大括号或方括号是不支持的。
控制器层
控制器层负责接收HTTP请求、处理HTTP响应,并调用服务层、数据层等进行处理。使用@RestController注解让Spring Boot应用程序变成一个完全的Web服务。
服务层
服务层负责业务处理,并调用数据层的相关方法进行数据操作。一般使用@Service注解标注服务类。
数据层
数据层负责数据的存储和读取,可以使用Spring Data JPA等框架进行数据操作。
Spring Boot的自动配置原理
Spring Boot的自动化配置能够在保持Spring开发人员认知度的同时,通过依赖分析和智能基础设施风格来自动配置Spring应用程序。Spring Boot本身不依赖于代码生成和复杂配置方式。
Spring Boot的自动配置特点
Spring Boot的自动配置以约定大于配置为核心原则,特点在于:
- 有限的开销:只有启用的自动化配置会自动配置应用程序。
- 安全原则:Spring Boot不会在不明确配置时自动启用基础设施。
- 可伸缩性:应用程序可以从自动配置中获益,也可以禁用对他们没有用处的配置。
Spring Boot自动配置的加载顺序
当@EnableAutoConfiguration注解启用自动配置时,Spring Boot会按照一定的规则依次加载自动配置项,直到完全加载完成。自动配置加载顺序如下:
- spring-boot-autoconfigure.jar/META-INF/spring.factories的EnableAutoConfiguration。
- 当前应用程序的classpath根据条件自动配置的来自META-INF/spring.factories的bean定义。
三、Spring Boot开发中的常用技术
1 Spring Boot的MVC架构
1.1 Spring Boot MVC的基本概念
在Spring Boot应用程序的开发和设计中常用到各种技术和框架,其中Spring Boot的MVC架构是一种常见的开发方式。该架构提供了一个模型-视图-控制器(MVC)的体系结构,简化了Web应用程序的开发过程。
在整个架构中可以将应用程序分成三个部分:
模型(Model)
:负责数据的存储和传递,并提供数据操作的方法。视图(View)
:用于展示数据,通常是一个HTML页面。控制器(Controller)
:接收用户请求并进行相应的操作。
在Spring Boot MVC中常使用@Controller
注解标注控制器类,使用@RequestMapping
注解标注控制器类中的方法,指定响应请求的URL地址。在方法中可以使用@RequestParam
或@PathVariable
注解获取请求参数或路径参数。
代码示例:
@Controller
@RequestMapping("/users")
public class UserController {@GetMapping("/{userId}")public String getUserInfo(@PathVariable Long userId, Model model) {// 根据userId从数据库中获取User对象信息User user = userService.getUserById(userId);// 将查询到的User对象信息添加到Model中model.addAttribute("userInfo", user);// 返回名为"userInfo.html"的视图页面return "userInfo.html";}@PostMapping("/{userId}/update")public String updateUser(@PathVariable Long userId, @RequestParam("userName") String userName,@RequestParam("userAge") int userAge) {// 根据userId更新数据库中对应User对象的userName和userAgeuserService.updateUser(userId, userName, userAge);// 重定向到/users/{userId}接口进行查询return "redirect:/users/{userId}";}
}
1.2 Spring Boot MVC开发注意事项
- 在编写
@Controller
时要注意每个方法的返回类型为String类型,并通过返回值指定要返回的视图名称或指定重定向或转发的地址。 - 在开发应用程序时,建议将JSP视图文件放置在
/resources/templates
目录下,并将所有静态文件(如css、js和图片等)放置在/resources/static
目录下。 - 当遇到复杂的数据操作逻辑时,可以使用Service层,对具体业务逻辑进行封装,降低控制器的负担。
- 在开发应用程序时,应充分利用Spring Boot的自动化配置功能,简化配置工作。
2 Spring Boot整合MyBatis框架
MyBatis是一款Java持久层框架通过XML或注解方式将对象映射到数据库表中。Spring Boot提供了非常方便的方式来集成MyBatis框架,使得开发人员能够更加高效、便捷地进行数据操作。
2.1 Spring Boot整合MyBatis的配置方法
在进行Spring Boot整合MyBatis框架的配置时可以按照以下步骤进行:
- 确保已经配置好MyBatis和MyBatis-Spring等相关依赖。
- 确认pom.xml文件中已经添加了数据库驱动相关依赖。
- 在application.properties文件中配置数据源相关信息。
- 创建MyBatis的映射文件或使用注解方式进行数据操作。
application.properties中的数据源配置:
# 数据库驱动配置
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 数据库连接信息配置
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123456
2.2 MyBatis的基本CRUD操作
通过MyBatis框架进行数据操作需要编写映射文件或注解,并使用SqlSession接口的方法执行SQL语句。MyBatis的基本CRUD操作如下:
- 查询数据操作:使用select查询语句,可以通过注解方式或XML方式进行实现。
- 插入数据操作:使用insert插入语句,可以通过注解方式或XML方式进行实现。
- 更新数据操作:使用update更新语句,可以通过注解方式或XML方式进行实现。
- 删除数据操作:使用delete删除语句,可以通过注解方式或XML方式进行实现。
MyBatis的基本CRUD操作:
<!-- 数据库表中的数据对象映射配置文件 -->
<!-- 查询操作(通过user_id查询对应的User对象信息) -->
<select id="getUserById" parameterType="long" resultMap="userResultMap">select * from t_user where user_id = #{userId}
</select>
<!-- 插入操作(插入一条新的User对象信息) -->
<insert id="insertUser" parameterType="User">insert into t_user(user_id,user_name,user_age) values(#{userId},#{userName},#{userAge})
</insert>
<!-- 更新操作(根据user_id更新对应的User对象信息) -->
<update id="updateUserById" parameterType="User">update t_user set user_name = #{userName}, user_age = #{userAge} where user_id = #{userId}
</update>
<!-- 删除操作(根据user_id删除对应的User对象信息) -->
<delete id="deleteUserById" parameterType="long">delete from t_user where user_id = #{userId}
</delete>
3 Spring Boot整合Spring Security框架
Spring Security是一款基于Spring Framework的安全框架能够为应用程序提供身份验证和访问控制等安全功能。Spring Boot提供了非常方便的方式来集成Spring Security框架,使得开发人员能够更加高效、便捷地开发安全应用程序。
3.1 Spring Security的安全认证机制
Spring Security的安全认证机制包括自定义用户和密码的认证方式,支持基于内存、LDAP、JDBC等多种用户信息认证方式。在Spring Boot应用程序中,可以通过注解方式配置安全认证信息。
Spring Security的安全认证配置:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate AuthUserDetailServiceImpl authUserDetailService;@Autowiredprivate AuthAccessDeniedHandler accessDeniedHandler;@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/", "/index").permitAll() // 设置首页和登录页允许匿名访问.antMatchers("/admin/**").hasRole("ADMIN") // 设置/admin下的URL需要ADMIN角色才可以访问.anyRequest().authenticated() // 其他URL都需要身份认证.and().formLogin().loginPage("/login") // 设置登录页面.defaultSuccessUrl("/index") // 登录成功后默认跳转的页面.failureUrl("/login?error").permitAll().and().logout().permitAll().and().exceptionHandling().accessDeniedHandler(accessDeniedHandler); // 设置异常处理器http.csrf().disable(); // 关闭csrf保护}@Overridepublic void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(authUserDetailService).passwordEncoder(new BCryptPasswordEncoder());}
}
3.2 Spring Security的常用配置方法
Spring Security的常用配置方法主要包括以下几个方面:
- 配置基于内存的用户信息认证方式。
- 配置基于文件的用户信息认证方式。
- 配置基于数据库的用户信息认证方式。
- 配置基于角色的访问控制。
- 配置HTTPS访问方式。
基于内存的用户信息认证方式:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredpublic void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().withUser("user").password("{noop}password").roles("USER").and().withUser("admin").password("{noop}password").roles("USER", "ADMIN");}
}
四、Spring Boot项目的部署与打包
1 Spring Boot项目的打包方式
1.1 jar包的打包方式
在使用Spring Boot开发应用程序时常用的打包方式是打成可执行的jar包,并通过命令行或脚本的方式启动应用程序。可以通过以下命令进行打包:
mvn clean package
在target目录下会生成一个以应用程序名称和版本号命名的jar包。同时在pom.xml文件中需要添加插件,并指定打包类型为jar。
pom.xml文件中进行jar包打包方式的配置:
<!-- 打包方式为jar -->
<packaging>jar</packaging><!-- jar包打包插件的配置 -->
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>
1.2 war包的打包方式
若需要将Spring Boot应用程序部署到Web容器中,可以将应用程序打包成war包。可以通过以下命令进行打包:
mvn clean package -Dmaven.test.skip=true
在target目录下会生成一个以应用程序名称和版本号命名的war包。同时,在pom.xml文件中需要添加插件,并指定打包类型为war。
pom.xml文件中进行war包打包方式的配置:
<!-- 打包方式为war -->
<packaging>war</packaging><!-- war包打包插件的配置 -->
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins>
</build>
2 Spring Boot项目的部署方法
2.1 传统方式的部署
在传统方式下将应用程序部署到Web容器中,可以使用Tomcat、Jetty等各种Web容器。具体的部署步骤如下:
- 将war包复制到Web容器中的WebApps目录下。
- 启动Web容器,在控制台中查看应用程序启动状态。
- 通过浏览器访问Web容器提供的URL地址,即可访问应用程序。
2.2 Docker容器的部署方式
Docker容器是一种轻量级的虚拟化技术能够将应用程序打包成一个镜像,并可在不同的环境中进行部署和运行。使用Docker容器可以快速地部署应用程序,避免了环境差异和依赖冲突的问题。
具体的部署步骤如下:
- 创建Dockerfile文件,指定基础镜像和应用程序的部署方式,并将应用程序打包成镜像文件。
- 构建Docker镜像,将Dockerfile文件中的配置参数和应用程序打包成一个镜像文件。
- 运行Docker容器,启动应用程序并将容器映射到外部端口,可以通过浏览器访问外部端口来访问应用程序。
Dockerfile文件的配置:
# 指定基础镜像
FROM openjdk:8-jdk-alpine# 构建应用程序
COPY ./target/myapplication.jar /app/# 暴露端口
EXPOSE 8080# 启动应用程序
CMD ["java", "-jar", "/app/myapplication.jar"]
五、小结回顾
1 Spring Boot的发展趋势
随着Spring Boot的逐渐成熟和广泛应用,其发展趋势也变得越来越明显。未来Spring Boot将继续朝着更加高效、便捷、安全、智能化等方向进行发展,并不断拓展应用场景和应用范围。
2 Spring Boot的优缺点评价
Spring Boot的优点主要包括:
- 提供了极其简单的应用程序开发和部署方式。
- 集成了众多的Spring生态系统组件,降低了开发难度和依赖冲突。
- 易于实现自动化配置和自定义配置。
- 提供了完善的测试和调试工具。
Spring Boot的缺点主要包括:
- 不适合大型企业级应用程序的复杂需求。
- 由于自动化配置的潜在风险,一些定制化开发需求无法很好地实现。
相关文章:
使用Spring Boot快速搭建项目:减少配置,提升开发效率
使用Spring Boot快速搭建项目:减少配置,提升开发效率 一、Spring Boot简介1 Spring Boot的起源2 Spring Boot的核心特点3 Spring Boot的优势 二、Spring Boot快速搭建项目1 Spring Boot的项目搭建方式使用Spring Initializr创建项目使用Spring Boot CLI创…...

(2)数码管
LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成"8"字器件 51单片机是共阴极连接 74HC245这个芯片有什么作用呢?解:这个芯片被称之为双向数据缓冲器这个芯片的作用,用来进行数据缓冲(提高驱…...

赫夫曼树和赫夫曼编码详解
目录 何为赫夫曼树? 赫夫曼树算法 赫夫曼编码 编程实现赫夫曼树 编程实现赫夫曼编码 编程实现WPL 总代码及分析 何为赫夫曼树? 树的路径长度:从树根到每一结点的路径长度之和 结点的带权路径长度:从树根到该结点的路径长度…...

unity UGUI系统梳理 -交互组件
概述 unity 中的交互组件可用于处理交互,例如鼠标或触摸事件以及使用键盘或控制器进行的交互 1、按钮 (Button) Button详解 2、开关 (Toggle) Background:背景图片,控制toggle组件的背景颜色改变,从而展示此物体是否被选中的…...

HTTP第15讲——HTTP的连接管理
短连接 HTTP 协议最初(0.9/1.0)是个非常简单的协议,通信过程也采用了简单的“请求 - 应答”方式。 它底层的数据传输基于 TCP/IP,每次发送请求前需要先与服务器建立连接,收到响应报文后会立即关闭连接。 因为客户端与…...

深度剖析Mybatis-plus Injector SQL注入器
背景 在项目中需要同时操作Sql Server 以及 MySQL 数据库,可能平时直接使用 BaseMapper中提供的方法习惯 了,不用的话总感觉影响开发效率,但是两个数据库的SQL语法稍微有点差别,有些暴露的方法并不能直接使用,所以便想…...

【Mysql实战】使用存储过程和计算同比环比
背景 同环比,是基本的数据分析方法。在各类调研表中屡见不鲜,如果人工向前追溯统计数据,可想而知工作量是非常大的。 标题复制10行,并且每行大于10个字符【源码解析】SpringBoot接口参数【Mysql实战】使用存储过程和计算同比环比…...

ChatGPT的前世今生,到如今AI领域的竞争格局,本文带你一路回看!
73年前,“机器思维”的概念第一次被计算机科学之父艾伦图灵(Alan Turing)提出,从此,通过图灵测试成为了人类在AI领域为之奋斗的里程碑目标。 73年后的今天,在AI历经了数十年的不断进化、迭代后,…...
如何在JavaScript中获取当前时间yyyymmddhhmmss? (六种实现方式)
## 介绍 在编写JavaScript代码时,我们经常需要获取当前日期和时间。在本文中,我们将介绍几种获取当前时间并将其格式化为 yyyymmddhhmmss 的字符串的方法。 方法一:使用Date对象 在JavaScript中,我们可以使用 Date 对象来获取当…...

一、走进easyUI的世界
1.什么是easyUI? jQuery EasyUI是一组基于jQuery的UI插件集合体,而jQuery EasyUI的目标就是帮助web开发者更轻松的打造出功能丰富并且美观的UI界面。开发者不需要编写复杂的javascript,也不需要对css样式有深入的了解,开发者需要…...

2023 上半年软件设计师知识点复习总纲
前言:全国计算机技术与软件专业技术资格(水平)考试(以下简称IT职业资格考试)是由中华人民共和国人事部主管,国家计算机网络与信息安全管理中心主办的一项国家级、权威性的计算机职业技能水平认证考试。主要…...

深入理解Java虚拟机:JVM高级特性与最佳实践-总结-3
深入理解Java虚拟机:JVM高级特性与最佳实践-总结-3 垃圾收集器与内存分配策略垃圾收集算法标记-清除算法标记-复制算法标记-整理算法 垃圾收集器与内存分配策略 垃圾收集算法 标记-清除算法 最基础的垃圾收集算法是“标记-清除”(Mark-Sweepÿ…...

vue3 cesium datav 可视化大屏
目录 0. 预览效果 1. 代码库包 2. 技术点 3. 一些注意事项(配置参数) 4. 相关代码详情 0. 预览效果 包含的功能: ① 地球按照一定速度自转 ② 修改加载的geojson面样式 ③ 添加 文字 标注! 1. 代码库包 直接采用vue-cli5 创建…...

python内置函数,推导式
abs:取绝对值 data abs(-10) pow:次方 data pow(2,5) sum:求和 num_list p[1,2,10,20] res sum(num_list) divmod取商和余数: v1,v2 divmod&…...
【Flink】DataStream API使用之Flink支持的数据类型
Flink的使用过程中,我们的数据都是定义好的 UserBehavior 类型,那还有没有其他更灵活的类型可以用呢?Flink 支持的数据类型到底有哪些? 1. Flink 的类型系统 Flink 作为一个分布式处理框架,处理的是以数据对象作为元…...

QT实现固高运动控制卡示波器
目录 一、固高示波器 二、基于QCustomPlot实现示波器 三、完整源码 一、固高示波器 固高运动控制卡自带的软件有一个示波器功能,可以实时显示速度的波形,可辅助分析电机的运行状态。但是我们基于sdk开发了自己的软件,无法再使用该功能&…...

洛谷P1157详解(两种解法,一看就会)
一、问题引出 组合的输出 题目描述 排列与组合是常用的数学方法,其中组合就是从 n n n 个元素中抽出 r r r 个元素(不分顺序且 r ≤ n r \le n r≤n),我们可以简单地将 n n n 个元素理解为自然数 1 , 2 , … , n 1,2,\dot…...
JavaScript异步编程和回调
目录 1、编程语言中的异步 2、JavaScript 3、回调 3.1在回调中处理错误 3.2回调的问题 3.2回调的替代方案 1、编程语言中的异步 默认情况下,JavaScript是同步的,并且是单线程…...

Qt开发笔记(Qt5.9.9下载安装环境搭建win10)
#1 Qt下载网站(国内、国外镜像) #2 Qt5.9.9安装选项 #3 配置系统环境变量 #4 创建测试项目 #1 Qt下载网站(国内、国外镜像) 官方下载地址(慢):http://download.qt.io/ 国内镜像网站 这里给大家…...

使用Plist编辑器——简单入门指南
本指南将介绍如何使用Plist编辑器。您将学习如何打开、编辑和保存plist文件,并了解plist文件的基本结构和用途。跟随这个简单的入门指南,您将掌握如何使用Plist编辑器轻松管理您的plist文件。 plist文件是一种常见的配置文件格式,用于存储应…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...