快速入门,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 {

    @Autowired
    private UserMapper userMapper;

    public User getUserById(Long id) {
        return userMapper.findById(id);
    }
    
    // 其他业务逻辑方法
}
  1. Controller

接收来自客户端的 HTTP 请求, 也就是不同url调用不同的函数, 函数对应着业务的逻辑

根据业务逻辑 调用相应的 Service 层方法, 然后把处理结果返回,通常返回 JSON、HTML 页面或其他格式的数据。

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/users/{id}")
    public User getUserById(@PathVariable Long id) {
        return userService.getUserById(id);
    }

    // 其他请求处理方法
}

4、内嵌服务器(Embedded Server)

概念
内嵌服务器是指将 Web 服务器嵌入到 Spring Boot 应用程序中,而不需要依赖外部的应用服务器。Spring Boot 通过将 Web 服务器(如 Tomcat、Jetty 或 Undertow)直接包含在应用程序的包中,使得应用程序能够以独立的 JAR 文件形式运行。

工作原理

  • 自动配置:Spring Boot 提供了自动配置功能来设置内嵌服务器的默认配置。通过 spring-boot-starter-web 依赖,Spring Boot 自动配置了嵌入式 Tomcat。
  • 启动:应用程序启动时,Spring Boot 会启动内嵌服务器并部署应用。这使得应用程序可以通过 java -jar 命令直接运行,无需额外的服务器部署步骤。
  • 切换服务器:尽管默认使用 Tomcat,你也可以通过修改 pom.xmlbuild.gradle 文件中的依赖来切换到 Jetty 或 Undertow。例如,使用 Jetty 替换 Tomcat,可以将 spring-boot-starter-tomcat 替换为 spring-boot-starter-jetty

优点

  • 简化部署:所有的代码和服务器都打包在一个 JAR 文件中,使得部署和管理更为简单。
  • 减少复杂性:不需要维护外部应用服务器,简化了开发和运维工作。

5、外部化配置(Externalized Configuration)

概念
外部化配置允许将应用程序的配置从代码中分离出来,使得配置可以在不同的环境中进行灵活的修改。这使得在不同的环境中(开发、测试、生产)使用不同的配置变得更加容易。

配置方式

  • 属性文件(application.properties):最常用的配置方式,可以在 src/main/resources 目录下创建 application.properties 文件。
  • YAML 文件(application.yml):与属性文件类似,但支持层次化配置。可以在 src/main/resources 目录下创建 application.yml 文件。
  • 环境变量:通过环境变量设置应用的配置,例如 SPRING_DATASOURCE_URL
  • 命令行参数:可以通过命令行参数覆盖配置,例如 --server.port=8081

优点

  • 灵活性:允许在运行时修改配置,而无需重新编译代码。
  • 环境适配:不同的环境可以使用不同的配置文件,方便应用在不同环境中运行。

application.propertiesapplication.yml 是 Spring Boot 中用于配置应用程序的文件。它们都是用来外部化配置的方式,允许在不同的环境中调整应用的行为。以下是对这两种配置文件的详细讲解:

1. application.properties

概念
application.properties 是 Spring Boot 默认的配置文件格式,它使用简单的键值对格式来定义配置属性。

语法

  • 键值对:每行定义一个键值对,格式为 key=value
  • 注释:可以使用 #! 来添加注释。

示例

# 设置服务器端口
server.port=8080

# 配置数据库连接
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=password

# 配置日志级别
logging.level.org.springframework.web=DEBUG

2. application.yml

概念
application.yml 是使用 YAML(YAML Ain't Markup Language)格式的配置文件,它允许定义更复杂的配置结构,支持层次化和更清晰的表达。

语法

  • 层次结构:通过缩进表示层次结构,键值对使用冒号分隔。
  • 注释:使用 # 来添加注释。
  • 列表:使用破折号 - 来表示列表项。
  • 字典:通过缩进表示字典中的键值对。

示例

# 设置服务器端口
server:
  port: 8080

# 配置数据库连接
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: password

# 配置日志级别
logging:
  level:
    org.springframework.web: DEBUG

配置文件的加载顺序

Spring Boot 会按以下顺序加载配置文件,后加载的配置会覆盖先加载的配置:

  1. application.propertiesapplication.yml 文件:从 src/main/resources 目录加载。
  2. 命令行参数:命令行参数的配置会覆盖配置文件中的设置。
  3. 环境变量:环境变量的配置也会覆盖配置文件中的设置。

4、Spring Security

添加这个依赖后, 访问网站就需要登录验证

4.1 JWT认证

在 Web 应用中,JWT 常用于实现用户身份认证和授权。特别是在客户端和服务器之间安全地传输信息。

下面简单介绍一下jwt的工作原理:
客户端向服务器发送请求, 服务器用 客户端发来的用户信息(比如userid) 和 自身的密钥(可以看成是一堆字符串)拼接成一个字符串, 然后通过加密算法得到一个新的字符串, 这个新的字符串就是jwt, 然后服务器会把这个jwt返回给客户端,
之后客户端的所有请求都需要带上jwt, 当服务器接收到时会用用户信息 和 自身 密钥 通过加密算法得到一个jwt, 然后判断该请求所带的jwt是否相同。 虽然jwt存在用户本地, 但是用户不知道服务器的密钥, 即使修改jwt也没用, 所以通过jwt验证是安全的

4.2 登录、获取信息、注册

  1. UsernamePasswordAuthenticationToken

Spring Security 中用于表示用户名和密码认证信息的类。

主要功能包括:

  • 在认证成功后,可以存储认证通过后的用户信息和权限。
  • 在身份验证过程中作为认证请求的载体。
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username,password);
  1. AuthenticationManager

Spring Security中用于执行身份认证的核心接口。它包含一个authenticate方法,用于执行身份验证的过程。

主要功能包括:

  • 返回一个已认证的Authentication对象,其中包含用户的认证信息和权限。
  • 如果认证失败,则抛出AuthenticationException异常。
Authentication authenticate = authenticationManager.authenticate(authenticationToken);  // 登录失败的话会报错误

authenticate.getPrincipal();  // 用来返回认证通过后的用户信息
  1. UserDetailsImpl

实现了 UserDetails(spring提供的) 接口的对象。 它包含了认证通过后的用户信息。(UserDetails 是springboot提供的, 里面包含获取用户名和用户密码的接口)

UserDetailsImpl loginUser = (UserDetailsImpl) authenticate.getPrincipal();

User user = loginUser.getUser();  // 通过接口获取用户
  1. 通过 JwtUtil 类创建jwt

自己写的类,用于创建jwt

String jwt = JwtUtil.createJWT(user.getId().toString());
  1. SecurityContextHolder

是 Spring Security 提供的一个工具类,用于访问当前的安全上下文。安全上下文包含了当前线程的认证信息。

下面写法可以获取当前认证过的用户信息

UsernamePasswordAuthenticationToken authenticationToken = (UsernamePasswordAuthenticationToken) SecurityContextHolder.getContext().getAuthentication();
UserDetailsImpl loginUser = (UserDetailsImpl) authenticationToken.getPrincipal();
  1. PasswordEncoder

Spring Security 中的一个接口,用于处理密码的加密和验证。

它定义了两个主要方法:一个用于将明文密码加密,另一个用于验证明文密码和加密后的密码是否匹配。

// 在用户注册账户的时候, 我们可以把密码加密, 然后再存到数据库
String encodedPassword = passwordEncoder.encode(rawPassword);
  1. JwtAuthenticationTokenFilter

自己写的类,用于过滤和验证jwt

  1. SecurityConfig

自己写的类,用于配置 Spring Security 的安全设置。

对于4.7.8, 网上有很多写好的, 初学阶段可以先直接拿来用, 后面再根据自己需求写对应的类。

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

其他文章地址:

快速入门,springboot知识点汇总

springboot常用注解大全(超详细, 30个)

springboot websocket知识点汇总

spring cloud 知识点汇总, 待更

posted @ 2024-07-10 16:22  小程xy  阅读(170)  评论(0编辑  收藏  举报