快速入门,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 常用依赖

下面是一些常用到的依赖

  1. MySQL Connector/J

MySQL 官方提供的 JDBC 驱动程序,用于 Java 应用程序与 MySQL 数据库之间的连接和通信。

  1. 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
  1. Project Lombok

可以让我们通过注解来减少样板代码的编写, 样板代码一般来说就是pojo类的get, set, 构造函数 ,equals,hashCode,toString等等。(下面会讲到pojo类)

  1. mybatis-plus-boot-startermybatis-plus-generator

MyBatis-Plus相关的依赖。

MyBatis-Plus 提供了一套通用的 Mapper 接口,通过继承这些接口,能够实现对单表的 CRUD 操作,无需编写重复的 SQL 语句。(相当于是它帮我们写好了很多mapper层的接口, 下面会讲到mapper)

如果加入上面两个mybatisplusspring不能正常使用mybatisplus的话可以加入这个依赖mybatis-spring

  1. spring-boot-starter-security

Spring Security 的相关依赖

Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架。通过简单的配置和注解,开发者可以实现复杂的身份验证和授权逻辑,保护应用程序的安全。也就是说通过它我们可以轻松的实现web上登录注册。

可以在下面讲到的时候再添加这个依赖, 不然要登录才能访问

3、 应用的关键层次和功能

POJO 层定义数据对象和封装数据。
Mapper 层与数据库交互,执行数据操作。
Service 层处理业务逻辑,调用 Mapper 层实现数据操作。
Controller 层接收和处理用户请求,调用 Service 层获取数据并返回响应。

我们一般会在myproject(上面层级结构中的)文件夹下分别创建pojomapperservicecontroller文件夹, 然后在文件夹中写java类

下面的样例代码中会出现很多注解, 它具体什么作用可自行查阅, 不同注解具体什么作用直接背过就行了, 初学阶段不要深究!!!

  1. 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 因为有上面三个注解, 所以会自动生成, 不需要手写
}
  1. Mapper

类名和表名相同, 实现不同表的基本sql查询,包括增删改查等操作。
(上面讲的MyBatis-Plus写好的有很多接口, 我们只需要继承MyBatis-Plus写好的接口就行, 可以参考 MyBatis-Plus官网 )

@Mapper
public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{id}")User findById(Long id);// 其他 SQL 操作方法
}
  1. Service

调用 Mapper 层的方法进行数据访问,处理返回结果并进行适当的业务处理。类名根据具体的业务定义。

@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public User getUserById(Long id) {return userMapper.findById(id);}// 其他业务逻辑方法
}
  1. 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 生成验证等过程的实现网上有很多写好的类, 我们直接引用到项目中使用就行, 初学阶段还是以用为主, 至于为什么这样写, 暂且不用管。 下面是我找到的~

  1. 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();}
}
  1. 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);}
}
  1. 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();}
}

暂时更新到这里… 过几天有时间再更

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

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

相关文章

Dart笔记:Isolate及其通信机制

Dart笔记 多隔离及其通信机制 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/a…

阿里云通义千问开源两款语音基座模型分别是SenseVoice和CosyVoice

阿里巴巴近期发布了开源语音大模型项目FunAudioLLM,该项目包含了两个核心模型:SenseVoice和CosyVoice。可以精准多语言识别并且进行语音克隆。 SenseVoice:精准多语言识别与情感辨识 SenseVoice主要致力于高精度多语言语音识别、情感辨识和…

《算法笔记》总结No.6——贪心

一.简单贪心 贪心法是求解一类最优化问题的方法,它总是考虑在当前状态下局部最优(或较优)之后,来使全局的结果达到最优(或较优)的策略。显然,如果采取较优而非最优的策略(最优策略可能不存在或是不易想到),得到的全局结果也无法是…

webGL可用的14种3D文件格式,但要具体问题具体分析。

hello,我威斯数据,你在网上看到的各种炫酷的3d交互效果,背后都必须有三维文件支撑,就好比你网页的时候,得有设计稿源文件一样。WebGL是一种基于OpenGL ES 2.0标准的3D图形库,可以在网页上实现硬件加速的3D图…

无人机之飞行规划与管理篇

无人机飞行规划与管理是确保无人机安全、高效且符合法规的运行的关键步骤。这一过程包括了对飞行任务的详细安排、航线的设定以及风险的评估和管理。下面简述这一过程的主要环节: 一、飞行目的和任务确定 在规划之初,必须明确无人机的飞行目的&#xf…

ETAS工具导入Com Arxml修改步骤

文章目录 前言Confgen之前的更改Confgen之后的修改CANCanIfComComMEcuM修改CanNmCanSMDCMCanTp生成RTE过程报错修改DEXT-诊断文件修改Extract问题总结前言 通讯协议栈开发一般通过导入DBC实现,ETAS工具本身导入DBC也是生成arxml后执行cfggen,本文介绍直接导入客户提供的arxml…

如何保证Redis缓存和数据库的数据一致性

前言 如果项目业务处于起步阶段,流量非常小,那无论是读请求还是写请求,直接操作数据库即可,这时架构模型是这样的: 但随着业务量的增长,项目业务请求量越来越大,这时如果每次都从数据库中读数据…

链表 OJ(一)

移除链表元素 题目连接: https://leetcode.cn/problems/remove-linked-list-elements/description/ 使用双指针法,开始时,一个指针指向头节点,另一个指针指向头节点的下一个结点,然后开始遍历链表删除结点。 这里要注…

【SGX系列教程】(五)enclave多线程测试,以及EPC内存测试

文章目录 一. 概述二. 原理分析2.1 多线程在Enclave中的实现流程2.2 多线程和EPC内存分配之间的冲突2.3 解决多线程和EPC内存分配冲突的策略 三. 源码分析3.1 代码结构3.2 源码3.2.1 App文件夹3.2.2 Enclave文件夹3.2.3 Makefile 3.3 总结 四.感谢支持 一. 概述 在Intel SGX环境…

HarmonyOS(43) @BuilderParam标签使用指南

BuilderParam BuilderParam使用举例定义模板定义具体实现BuilderParam初始化 demo源码参考资料 BuilderParam 该标签有的作用有点类似于设计模式中的模板模式,类似于指定一个UI占位符,具体的实现交给具体的Builder,顾名思义,可以…

【算法】排序算法介绍 附带C#和Python实现代码

1. 冒泡排序(Bubble Sort) 2. 选择排序(Selection Sort) 3. 插入排序(Insertion Sort) 4. 归并排序(Merge Sort) 5. 快速排序(Quick Sort) 排序算法是计算机科学中的一个基础而重要的部分,用于将一组数据按照一定的顺序排列。下面介绍几种常见的排序算法,…

可控学习综述:信息检索中的方法、应用和挑战

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

YOLOv10改进 | Conv篇 | 利用YOLO-MS的MSBlock轻量化网络结构(既轻量又长点)

一、本文介绍 本文给大家带来的改进机制是利用YOLO-MS提出的一种针对于实时目标检测的MSBlock模块(其其实不能算是Conv但是其应该是一整个模块),我们将其用于C2f中组合出一种新的结构,来替换我们网络中的模块可以达到一种轻量化的作用,我将其…

【Python基础】代码如何打包成exe可执行文件

本文收录于 《一起学Python趣味编程》专栏,从零基础开始,分享一些Python编程知识,欢迎关注,谢谢! 文章目录 一、前言二、安装PyInstaller三、使用PyInstaller打包四、验证打包是否成功五、总结 一、前言 本文介绍如何…

SFUZZ模糊测试平台全新升级,从标准到实践助力车企安全出海

开源网安模糊测试平台SFuzz全新升级,参照各国相关标准要求进行针对性建设,可为智能网联汽车信息安全测试提供更为强大的工具支持。SFuzz向被测系统输入大量随机数据,模拟各种异常情况,可以发现被测系统内潜在的缺陷和漏洞&#xf…

ChatGPT提问获取高质量答案的艺术PDF下载书籍推荐分享

ChatGPT高质量prompt技巧分享pdf, ChatGPT提问获取高质量答案的艺术pdf。本书是一本全面的指南,介绍了各种 Prompt 技术的理解和利用,用于从 ChatGPTmiki sharing中生成高质量的答案。我们将探讨如何使用不同的 Prompt 工程技术来实现不同的目…

C语言——结构体

一、定义和使用结构体 1.1概述 前面我们见过的数据类型,比如int,float,char等是在程序中简单的使用,如果我们要根据自己的需求来建立一些复杂的数据,就需要用到结构体。 例如,一个学生的学号,姓名,性别&am…

Python 利用pandas处理CSV文件(DataFrame的基础用法)

前面介绍过通过Python标准库中的CSV模块处理CSV文件: Python 利用CSV模块处理数据 相比CSV模块,pandas的功能更加强大,本文将简单介绍如何通过pandas来处理CSV文件。 文章目录 一、pandas简介二、用法示例2.1 读取CSV文件2.1.1 read_csv参数…

Python 视频的色彩转换

这篇教学会介绍使用OpenCV 的cvtcolor() 方法,将视频的色彩模型从RGB 转换为灰阶、HLS、HSV...等。 因为程式中的OpenCV 会需要使用镜头或GPU,所以请使用本机环境( 参考:使用Python 虚拟环境) 或使用Anaconda Jupyter 进行实作( 参考&#x…

火柴棒图python绘画

使用Python绘制二项分布的概率质量函数(PMF) 在这篇博客中,我们将探讨如何使用Python中的scipy库和matplotlib库来绘制二项分布的概率质量函数(PMF)。二项分布是统计学中常见的离散概率分布,描述了在固定次…