快速入门,springboot知识点汇总
学习 springboot 应该像学习一门编程语言一样,首先要熟练掌握常用的知识,而对于不常用的内容可以简单了解一下。先对整个框架和语言有一个大致的轮廓,然后再逐步补充细节。
前序:
Spring Boot 通过简化配置和提供开箱即用的特性,大大加快了 Spring 应用的开发过程。
1、构建一个 Spring Boot 项目
打开idea
, 选择新建项目, 生成器选择spring initiallzr
, 类型选择Maven
, 然后点击下一步, 依赖项可以选个spring web
。
整个 项目结构 如下
myproject
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── example
│ │ │ └── myproject
│ │ │ └── MyprojectApplication.java
│ │ └── resources
│ │ └── application.properties
└── pom.xml
正常初始化一个项目时, 我们还需要导入很多依赖, 而且过程很繁琐
而maven就可以简化这个导入依赖这个过程,我们可以通过 Maven 配置文件(pom.xml),减少了依赖管理的复杂性。
2、导入依赖
进入 maven官网, 在搜索框中可以搜索到我们需要的依赖。
比如我们搜索 Spring Boot Starter JDBC
这个依赖, 选择版本号, 把下面的代码粘贴到pom.xml
文件中的dependencies
标签中就算是导入依赖。(记得刷新才可以)
2.1 常用依赖
下面是一些常用到的依赖
MySQL Connector/J
MySQL 官方提供的 JDBC 驱动程序,用于 Java 应用程序与 MySQL 数据库之间的连接和通信。
Spring Boot Starter JDBC
可以快速地配置和使用 JDBC 数据库连接。通俗的来说, 我们引入这个依赖后就可以快速的让程序连接到数据库, 并且通过代码来编写sql
语句, 控制数据库。
连接数据库:
我们可以通过在application.properties
配置文件中配置如下信息就可以连接到数据库
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
Project Lombok
可以让我们通过注解来减少样板代码的编写, 样板代码一般来说就是pojo
类的get, set, 构造函数 ,equals,hashCode,toString等等
。(下面会讲到pojo
类)
mybatis-plus-boot-starter
和mybatis-plus-generator
MyBatis-Plus相关的依赖。
MyBatis-Plus 提供了一套通用的 Mapper 接口,通过继承这些接口,能够实现对单表的 CRUD 操作,无需编写重复的 SQL 语句。(相当于是它帮我们写好了很多mapper
层的接口, 下面会讲到mapper
)
如果加入上面两个mybatisplus
后spring
不能正常使用mybatisplus
的话可以加入这个依赖mybatis-spring
spring-boot-starter-security
Spring Security 的相关依赖
Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架。通过简单的配置和注解,开发者可以实现复杂的身份验证和授权逻辑,保护应用程序的安全。也就是说通过它我们可以轻松的实现web上登录注册。
可以在下面讲到的时候再添加这个依赖, 不然要登录才能访问
3、 应用的关键层次和功能
POJO
层定义数据对象和封装数据。
Mapper
层与数据库交互,执行数据操作。
Service
层处理业务逻辑,调用 Mapper 层实现数据操作。
Controller
层接收和处理用户请求,调用 Service 层获取数据并返回响应。
我们一般会在myproject
(上面层级结构中的)文件夹下分别创建pojo
、mapper
、service
、controller
文件夹, 然后在文件夹中写java类
下面的样例代码中会出现很多注解, 它具体什么作用可自行查阅, 不同注解具体什么作用直接背过就行了, 初学阶段不要深究!!!
- pojo
pojo中文件名(pojo类名)一般定义成和数据库中的表名相同
,一般把变量名定义成和该表中的字段名相同
,这样springboot
就会自动的把这个pojo和类的变量直接映射到数据库中对应的表和列中。
这样外部要访问数据库就可以通过这个pojo类的get,set
方法获取修改该pojo类对应的数据库中的表。 但是每个pojo类都要写这些方法难免会有些繁琐, 我们可以通过上面下载的依赖Project Lombok
来自动完成, 只需要在pojo类上面写上@Data
@NoArgsConstructor
@AllArgsConstructor
这三个注解, 这个依赖就会自动帮我们生成
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {private Long id;private String username;private String email;// Getters and setters// toString, equals, hashCode 因为有上面三个注解, 所以会自动生成, 不需要手写
}
- Mapper
类名和表名相同, 实现不同表的基本sql查询,包括增删改查等操作。
(上面讲的MyBatis-Plus
写好的有很多接口, 我们只需要继承MyBatis-Plus
写好的接口就行, 可以参考 MyBatis-Plus官网 )
@Mapper
public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{id}")User findById(Long id);// 其他 SQL 操作方法
}
- Service
调用 Mapper 层的方法进行数据访问,处理返回结果并进行适当的业务处理。类名根据具体的业务定义。
@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public User getUserById(Long id) {return userMapper.findById(id);}// 其他业务逻辑方法
}
- Controller
接收来自客户端的 HTTP 请求, 也就是不同url
调用不同的函数, 函数对应着业务的逻辑
根据业务逻辑 调用相应的 Service 层方法, 然后把处理结果返回,通常返回 JSON、HTML 页面或其他格式的数据。
@RestController
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/users/{id}")public User getUserById(@PathVariable Long id) {return userService.getUserById(id);}// 其他请求处理方法
}
4、Spring Security
添加这个依赖后, 访问网站就需要登录验证
4.1 JWT认证
在 Web 应用中,JWT 常用于实现用户身份认证和授权。特别是在客户端和服务器之间安全地传输信息。
下面简单介绍一下jwt
的工作原理:
客户端向服务器发送请求, 服务器用 客户端发来的用户信息
(比如userid) 和 自身的密钥
(可以看成是一堆字符串)拼接
成一个字符串, 然后通过加密算法得到一个新的字符串, 这个新的字符串就是jwt
, 然后服务器会把这个jwt
返回给客户端,
之后客户端的所有请求都需要带上jwt
, 当服务器接收到时会用用户信息
和 自身 密钥
通过加密算法得到一个jwt
, 然后判断该请求所带的jwt
是否相同。 虽然jwt
存在用户本地, 但是用户不知道服务器的密钥, 即使修改jwt
也没用, 所以通过jwt
验证是安全的
4.2 JWT准备工作
上面讲的 jwt
生成验证等过程的实现网上有很多写好的类, 我们直接引用到项目中使用就行, 初学阶段还是以用为主, 至于为什么这样写, 暂且不用管。 下面是我找到的~
JwtUtil
类用来创建、解析jwt token
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.stereotype.Component;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
import java.util.Date;
import java.util.UUID;@Component
public class JwtUtil {public static final long JWT_TTL = 60 * 60 * 1000L * 24 * 14; // 有效期14天public static final String JWT_KEY = "SDFGjhdsfalshdfHFdsjkdsfds121232131afasdfac";public static String getUUID() {return UUID.randomUUID().toString().replaceAll("-", "");}public static String createJWT(String subject) {JwtBuilder builder = getJwtBuilder(subject, null, getUUID());return builder.compact();}private static JwtBuilder getJwtBuilder(String subject, Long ttlMillis, String uuid) {SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;SecretKey secretKey = generalKey();long nowMillis = System.currentTimeMillis();Date now = new Date(nowMillis);if (ttlMillis == null) {ttlMillis = JwtUtil.JWT_TTL;}long expMillis = nowMillis + ttlMillis;Date expDate = new Date(expMillis);return Jwts.builder().id(uuid).subject(subject).issuer("sg").issuedAt(now).signWith(secretKey).expiration(expDate);}public static SecretKey generalKey() {byte[] encodeKey = Base64.getDecoder().decode(JwtUtil.JWT_KEY);return new SecretKeySpec(encodeKey, 0, encodeKey.length, "HmacSHA256");}public static Claims parseJWT(String jwt) throws Exception {SecretKey secretKey = generalKey();return Jwts.parser().verifyWith(secretKey).build().parseSignedClaims(jwt).getPayload();}
}
JwtAuthenticationTokenFilter
用来验证jwt token,如果验证成功,则将User信息注入上下文中
import io.jsonwebtoken.Claims;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.filter.OncePerRequestFilter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;@Component
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {@Autowiredprivate UserMapper userMapper;@Overrideprotected void doFilterInternal(HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull FilterChain filterChain) throws ServletException, IOException {String token = request.getHeader("Authorization");if (!StringUtils.hasText(token) || !token.startsWith("Bearer ")) {filterChain.doFilter(request, response);return;}token = token.substring(7);String userid;try {Claims claims = JwtUtil.parseJWT(token);userid = claims.getSubject();} catch (Exception e) {throw new RuntimeException(e);}User user = userMapper.selectById(Integer.parseInt(userid));if (user == null) {throw new RuntimeException("用户名未登录");}UserDetailsImpl loginUser = new UserDetailsImpl(user);UsernamePasswordAuthenticationToken authenticationToken =new UsernamePasswordAuthenticationToken(loginUser, null, null);SecurityContextHolder.getContext().setAuthentication(authenticationToken);filterChain.doFilter(request, response);}
}
SecurityConfig
类用来放行登录、注册等接口
import JwtAuthenticationTokenFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.CsrfConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;@Configuration
@EnableWebSecurity
public class SecurityConfig {@Autowiredprivate JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter;@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}@Beanpublic AuthenticationManager authenticationManager(AuthenticationConfiguration authConfig) throws Exception {return authConfig.getAuthenticationManager();}@Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.csrf(CsrfConfigurer::disable) // 基于token,不需要csrf.sessionManagement((session) -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) // 基于token,不需要session.authorizeHttpRequests((authz) -> authz.requestMatchers("/user/account/token/", "/user/account/register/").permitAll() // 放行api.requestMatchers(HttpMethod.OPTIONS).permitAll().anyRequest().authenticated()).addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);return http.build();}
}
暂时更新到这里… 过几天有时间再更
相关文章:
快速入门,springboot知识点汇总
学习 springboot 应该像学习一门编程语言一样,首先要熟练掌握常用的知识,而对于不常用的内容可以简单了解一下。先对整个框架和语言有一个大致的轮廓,然后再逐步补充细节。 前序: Spring Boot 通过简化配置和提供开箱即用的特性,…...
Ubuntu20.04系统非root用户安装GAMIT10.71
(测试环境:20240701升级包和20240701数据,解算通过) QQ:8212714 群:302883438群文件(source安装包20240701升级包) 1、首先在计算机中安装VMware Workstation 16 Pro。建议:分配…...
stm32 开发板可以拿来做什么?
STM32开发板可以用来做许多不同的事情,具体取决于您的应用需求和编程能力。我收集归类了一份嵌入式学习包,对于新手而言简直不要太棒,里面包括了新手各个时期的学习方向编程教学、问题视频讲解、毕设800套和语言类教学,敲个22就可…...
latex英文转中文word,及一些latex相关工具分享
前言:想要转换latex生成的英文pdf文件为中文word文件 一、主要步骤 1、文字翻译:直接使用谷歌翻译等辅助将英文翻译成中文即可; 支持英文pdf文件全文翻译,再用迅捷PDF转换器之类的转成word,再手动调整。 https://app…...
EasyOCR: 简单易用的多语言OCR工具
EasyOCR: 简单易用的多语言OCR工具 1. 什么是EasyOCR?2. 使用场景3. 基本使用方法安装示例代码代码解释 4. 结语 1. 什么是EasyOCR? EasyOCR是一个基于Python的开源光学字符识别(OCR)工具,它支持80多种语言的文本识别。该项目由JaidedAI开发,旨在提供一个简单易用但功能强大…...
arm架构安装chrome
在ARM架构设备上安装谷歌软件或应用通常涉及到几个步骤,这取决于你要安装的具体谷歌产品,比如谷歌浏览器、Google Play服务或者是其他谷歌开发的软件。下面我会给出一些常见的指导步骤,以安装谷歌浏览器为例: 在Linux ARM64上安装…...
ETAS工具导入Com Arxml修改步骤
文章目录 前言Confgen之前的更改Confgen之后的修改CANCanIfComComMEcuM修改CanNmCanSMDCMCanTp生成RTE过程报错修改DEXT-诊断文件修改Extract问题总结前言 通讯协议栈开发一般通过导入DBC实现,ETAS工具本身导入DBC也是生成arxml后执行cfggen,本文介绍直接导入客户提供的arxml…...
Apache Kylin模型构建全解析:深入理解大数据的多维分析
引言 Apache Kylin是一个开源的分布式分析引擎,旨在为大数据提供快速的多维分析能力。它通过预计算技术,将数据转化为立方体模型(Cube),从而实现对Hadoop大数据集的秒级查询响应。本文将详细介绍Kylin中模型构建的全过…...
element-plus的文件上传组件el-upload
el-upload组件 支持多种风格,如文件列表,图片,图片卡片,支持多种事件,预览,删除,上传成功,上传中等钩子。 file-list:上传的文件集合,一定要用v-model:file-…...
等保测评视角下的哈尔滨智慧城市安全框架构建
随着智慧城市的兴起,哈尔滨作为东北地区的重要城市,正在积极探索和实践智慧城市安全框架的构建,以确保在数字化转型的过程中,既能享受科技带来的便利,又能有效防范和应对各类网络安全风险。 本文将从等保测评的视角出…...
Java中的数据缓存技术及其应用
Java中的数据缓存技术及其应用 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在现代应用程序中,数据缓存是一种重要的技术手段,用于提…...
SQL 索引
一、索引的基本概念 **索引(Index)**是数据库中一种特殊的数据结构,用于帮助数据库管理系统(DBMS)快速访问数据表中的特定信息。索引类似于书籍的目录,可以加快数据检索的速度。 二、索引的作用 提高查询…...
free第一次成功,第二次失败
问题描述: 在一个函数中存在free,第一次进入此函数没有问题,但是第二次出错 strncpy(pdd_all_data[i].sensor_name,white_list[j].dev_name,strlen(pdd_all_data[i].sensor_name)); 上面代码都是使用strncpy不小心导致double free or corrup…...
各种音频处理器
在HiFi(高保真)音频系统中,通常需要使用一些特定类型的音频处理器,以确保音频信号的高保真和优质输出。以下是一些常见的音频处理器类型及其在HiFi系统中的应用: DAC(数模转换器): …...
深度学习探秘:Transformer模型跨框架实现大比拼
深度学习探秘:Transformer模型跨框架实现大比拼 自2017年Transformer模型问世以来,它在自然语言处理(NLP)领域引发了一场革命。其独特的自注意力机制为处理序列数据提供了全新的视角。随着深度学习框架的不断发展,Tra…...
京准电钟:云计算中NTP网络时间服务器的作用是什么?
京准电钟:云计算中NTP网络时间服务器的作用是什么? 京准电钟:云计算中NTP网络时间服务器的作用是什么? NTP是一种用于同步网络中设备时间的协议,广泛用于互联网和局域网中。NTP网络时间服务器则是基于NTP协议构建&…...
Apache中使用CGI
Apache24 使用Visual Studio 2022 // CGI2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <stdio.h> #include <stdlib.h>#include <stdio.h>void main() {//设置HTML语言printf("Content-type:text/html\n\n&q…...
宏任务与微任务对比【前端异步】
目录 简介微任务与宏任务的基本概念宏任务(Macrotasks)微任务(Microtasks)宏任务示例微任务示例微任务与宏任务的执行时序 结论 简介 在JavaScript的异步编程中,理解事件循环(Event Loop)是至关…...
Autogen和LangGraph对比
AutoGen和LangGraph是两种用于构建多代理AI系统的框架,它们各有特点和优势。以下是对这两个框架的详细对比: 共同点 都支持创建多个AI代理进行协作都可以与大语言模型(LLM)集成都允许定义代理之间的交互流程都支持使用工具和外部资源来增强代理能力 AutoGen的特点 灵活的代…...
uniapp vue3微信小程序如何获取dom元素
在网上很多人说可以通过下面两种形式获取到指定dom元素 // 定义ref <div ref"box"></div>//1通过this.$refs获取dom元素 this.$refs.box//2通过ref(null)获取dom元素 let box ref(null)第一种方式在vue2中是可以获取到的,但是在vue3 setup中…...
Mongodb索引使用限制
学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第85篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题,欢迎在文章下面点个赞,或者关…...
阿里云通义千问开源两款语音基座模型分别是SenseVoice和CosyVoice
阿里巴巴近期发布了开源语音大模型项目FunAudioLLM,该项目包含了两个核心模型:SenseVoice和CosyVoice。可以精准多语言识别并且进行语音克隆。 SenseVoice:精准多语言识别与情感辨识 SenseVoice主要致力于高精度多语言语音识别、情感辨识和…...
第11章 规划过程组(二)(11.10制订进度计划)
第11章 规划过程组(二)11.10制订进度计划,在第三版教材第402~404页; 文字图片音频方式 第一个知识点:主要输出 1、进度基准 经过批准的进度模型,只有通过正式的变更控制程序才能进行变更,用作…...
如何在Spring Boot中集成Hibernate
如何在Spring Boot中集成Hibernate 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨如何在Spring Boot项目中集成Hibernate。Hibernate是一个广泛…...
Grind 75 | 3. merge two sorted lists
Leetcode 21. 合并两个有序链表 题目链接 思路: 和归并排序中 merge 部分一致 两个指针分别指向 2 个链表头每次选小的那个加入 res 中,对应指针后移一位;重复步骤2,直至一个指针到链表末尾将另一个剩余的全部 copy 到 res 中,链…...
MyBatis(35)如何在 MyBatis 中实现软删除
实现软删除在MyBatis中通常意味着更新数据库记录的某个字段,而不是真正地从数据库中删除记录。这个字段(通常是is_deleted、deleted或status等)被用来标记记录是否被删除。下面我们将详细探讨如何在MyBatis中实现软删除,包括数据库…...
C# 预处理器指令
C# 预处理器指令 概述 C# 预处理器指令是编译器在编译代码之前处理的指令。这些指令用于控制编译过程,包括条件编译、编译指令的定义和取消等。预处理器指令以 # 开头,不包含在代码的执行逻辑中,仅在编译阶段起作用。 常用的预处理器指令 1. #define 和 #undef #define…...
Perl编译器架构:前端与后端的精细分工
🔧 Perl编译器架构:前端与后端的精细分工 Perl作为一种高级、通用的编程语言,其编译器的架构设计对于性能和灵活性至关重要。Perl编译器由前端和后端组成,它们各自承担着不同的职责。本文将深入解析Perl编译器前端和后端的区别&a…...
14-63 剑和诗人37 - 分布式系统中的数据访问设计
在分布式系统中,跨服务和数据库提供统一、可靠的数据访问至关重要,但又极具挑战性。微服务和数据库的拓扑结构为分布、缓存、复制和同步带来了复杂性。 让我们探索有助于解决这些复杂性并简化构建强大、高性能分布式系统的常见数据访问模式。 概述 我们将通过示例介绍…...
大数据基础:Hadoop之MapReduce重点架构原理
文章目录 Hadoop之MapReduce重点架构原理 一、MapReduce概念 二、MapReduce 编程思想 2.1、Map阶段 2.2、Reduce阶段 三、MapReduce处理数据流程 四、MapReduce Shuffle 五、MapReduce注意点 六、MapReduce的三次排序 Hadoop之MapReduce重点架构原理 一、MapReduce概…...
最牛黑客做的白粉交易网站/google官方下载安装
Matlab求解方同轴波导的截止波长和特性阻抗作者:金静逯迈陈小强来源:《现代电子技术》2008年第03期摘要:采用有限差分法利用Matlab求解了方同轴波导的特性阻抗和高次模的…...
自己做网站写网页一般用gbk还是gb2312还是utf8/网站友情链接的好处
2019独角兽企业重金招聘Python工程师标准>>> 1.创建索引 简单创建索引 PUT sfpay_log 创建成功 {"acknowledged": true,"shards_acknowledged": true,"index": "sfpay_log" } 指定创建参数:索引分片数量、副本数…...
腾讯的网络营销模式/微博seo排名优化
《《转载》》今天刚刚搞明白这个问题,贴出来希望能给一些和我一样不是很懂的人一些参考,可惜的是我用的方法还不是特别方便,以后有了更好的方法会继续和大家分享的。这里我以一个经典的汉诺塔问题为例来进行说明。【问题描述】有三个塔分别标…...
263邮箱个人登录入口/长沙seo男团
前言 由浅入深、逐个击破 30SecondsOfCode 中函数系列所有源码片段,带你领略源码之美。 本系列是对名库 30SecondsOfCode 的深入刨析。 本篇是其中的函数篇,可以在极短的时间内培养你的函数式思维。 内容根据源码的难易等级进行排版,目录…...
网站建设推广怎么做/网站流量统计分析的维度包括
原文链接:http://www.phpweblog.net/AngelLee2009/archive/2009/08/16/6848.html 1.什么是模式? 模式,即pattern。其实就是解决某一类问题的方法论。你把解决某类问题的方法总结归纳到理论高度,那就是模式。 Alexand…...
ie显示wordpress网页靠左/网络营销ppt课件
Linux上配置一个服务器环境,看了一下jdk的版本只有1.4,要换成1.6的,所以安装之前先得把jdk换成1.6的。一、Linux版本:redhat1、查看jdk的版本:输入命令:java –version返回:java version "…...