SpringBoot

本文最后更新于 2025年11月12日 上午

SpringBoot

介绍

SpringBoot是一个Spring模块,提供了RAD(快速应用程序开发)功能。它用于创建独立的基于Spring的应用程序,需要最少的Spring配置就可以运行。

即Spring框架和嵌入式服务器的组合。

自动配置了 Web 服务、JSON 转换、Tomcat 服务器等,不用手动配置 XML。

即自带内嵌Tomcat的Java程序,运行后监听localhost:8080

结构

作用
@SpringBootApplication 主类,入口
config 配置类,用于全局配置,在启动时加载,注册拦截器等。
controller
filter
interceptor
exception
控制层,接受前端请求,并调用服务层。
过滤器,来自Servlet,作用整个Servlet层。
拦截器,来自SpringMVC,控制层的横切,请求到达之前/之后的公共逻辑。
异常层,控制层的横切,控制异常。
service 服务层,处理业务逻辑,并调用持久层。
repository 持久层,操作数据库。
model 实体层,映射数据库表。
common 通用层,可以封装前后端接口等,被所有曾通用

注解

@Component

作用:在组件扫描时,带有@Component及其衍生注解的类会被注册为Bean,通用组件,任何需要托管的类都可以用这个组件。

衍生注解:

  • @Service:服务层,处理业务逻辑。
  • @Repository:持久层,处理数据库操作。
  • @Controller:控制层,处理Web请求。
  • @Configuration:配置类,注册Bean,有动态代理增强。

用法:注解在类上。

@Configuration

作用:配置类功能,可以用来定义Bean,相当于XML文件,允许在其下使用@Bean的注解来注册Bean到Spring容器。

本质也是个特殊的@Component,会被组件扫描,会启用动态代理增强机制,保证多个@Bean之间安全相互调用,返回的是同一个Bean实例。

用法:注解在类上。

@ComponentScan

作用:组件扫描功能,注册标注了@Component等注解的类为Bean。

扫描范围默认为当前包及其子包的所有组件。

用法:注解在类上。

@Autowired

作用:用于将Spring容器内的某个Bean自动注入到另一个类的字段/构造器/方法。

自动注入是IOC(控制反转)的一部分,减少耦合,由Spring容器管理依赖关系。

如果是构造函数注入的话不需要@Autowired,Spring容器会自动注入。

用法:

  • 注解在字段上;
1
2
3
4
5
6
7
8
9
10
11
@Component
public class UserService {

@Autowired
private UserRepository userRepository; // 自动注入Spring容器内的UserRepository类

public void saveUser() {
userRepository.save(new User());
}
}

  • 注解在Setter方法上

@Qualifier

作用:自动注入有多个类型匹配的Bean时,明确指定注入哪个Bean。

用法:和@Autowired一起注解。

控制类

@RequestMapping

作用:请求映射功能,可以映射URL路径。

用法:注解在类上或者方法上。

属性:

  • value:指定URL路径(可省略)
  • method:指定HTTP方法(GET,POST等)
  • params:限制请求必须包含/不包含哪些参数

衍生注解:

  • @GetMapping("/path")等价于@RequestMapping(value="/path", method=RequestMethod.GET)
  • @PostMapping
  • @PutMapping:通常包含请求体,请求更新的资源。
  • @DeleteMapping
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Controller
@RequestMapping("/api") // 公共前缀
public class UserController {

@RequestMapping(value = "/users", method = RequestMethod.GET)
public String listUsers() {
return "user-list"; // 返回视图名
}

@RequestMapping(value = "/users", method = RequestMethod.POST)
public String createUser() {
return "user-created";
}
}

@PathVariable

作用:从请求的URL路径中提取参数值,传递到处理方法的参数中。

用法:注解在形参上。

如果有多个时,如下。

1
2
3
4
5
@GetMapping("/{userId}/posts/{postId}")
public String getPostByUser(@PathVariable("userId") Long userId, @PathVariable("postId") Long postId) {
return "User ID: " + userId + ", Post ID: " + postId;
}

@RequestParam

作用:从请求的URL查询字符串中提取参数(?key=value),传递到处理方法的参数中。

用法:注解在形参上。

1
2
3
4
5
6
7
8
@GetMapping("/search")
public String search(
@RequestParam String name,
@RequestParam int age
) {
// name = "Tom", age = 25
return "Searched for " + name + ", age " + age;
}

属性:

  • value/name:指定查询字符串的参数名。

  • required:是否必须提供。

true(默认)

  • defaultValue:参数缺失时的默认值。

@RequestBody

作用:接收客户端发送的JSON数据并转化为对象。

用法:注解在形参上。

@ResponseBody

作用:方法的返回值会直接写入HTTP响应体,返回JSON或XML数据。

用法:注解在方法上。

在带有@Controller或组合注解标记的类下,对带有@RequestMapping及其衍生注解(如@GetMapping@PostMapping等)的请求处理方法起作用。

不过一半可以直接@RestController

1
2
3
4
5
6
7
8
@Controller
public class ApiController {
@GetMapping("/api/hello")
@ResponseBody
public String hello() {
return "Hello, World!"; // 直接返回字符串内容
}
}

异常类

@ControllerAdvice

作用:让该类能拦截并处理全局 Controller 层的异常,当项目中任意一个控制类抛出异常时,Spring 会自动把异常传递到这里匹配对应的 @ExceptionHandler

用法:注解在类上。

@ExceptionHandler

作用:当抛出特定类型的异常时,匹配这个方法。

用法:注解在方法上。

实体类

@Entity

作用:JPA库中,标记当前类是一个实体类,对应数据库中的一张表,类下的字段对应表中的列。

用法:注解在类上。

@ID

作用:标识实体类的主键字段。

用法:注解在字段上。

@GeneratedValue

作用:搭配@ID,指定主键的生成策略。

属性:

  • strategy

GenerationType.IDENTITY:使用数据库的自增长策略来生成主键值。

用法:注解在字段上。

@JsonIdentityInfo

作用:避免双向关系导致的无限递归,在序列化时,如果一个对象已经被序列化过了,就只输出它的标识属性。

用法:注解在类上。

属性:

  • generator:指定如何生成对象的唯一标识。

    ObjectIdGenerators.PropertyGenerator.class

  • property:指定哪个字段作为唯一标识,一般是id

@OneToMany

作用:表示一对多的关系,多的将会在数据库中添加一个外键用来指向一的键。

用法:注解在字段上。

属性:

  • mappedBy:表示这一方不是维护关系的一方,没有外键。

    通常就是这个类。

  • cascade:级联操作,对一做数据库操作时会传递到多的数据库中。

    CascadeType.ALL

  • orphanRemoval:是否移除多的一方的孤儿对象。

    true时表示移除孤儿对象。

    例如:owner类中的pets字段

    1
    2
    @OneToMany(mappedBy = "owner", cascade = CascadeType.ALL)
    private Collection<Pet> pets = new ArrayList<>();

@ManyToOne

作用:表示多对一的关系。

用法:注解在字段上。

@JoinColumn

作用:指定外键列。

用法:注解在字段上。

属性:

  • name:生成外键列的名字。

通用类

@Data

作用:Lombok库,包括@Getter@Setter@ToString@EqualsAndHashCode@RequiredArgsConstructor方法。

用法:注解在类上。

@NoArgsConstructor@AllArgsConstructor也是Lombok库中,可以自动生成无参构造和全参构造。

@EnableAutoConfiguration

作用:自动配置功能,会根据所添加的依赖如spring-boot-starter-webspring-boot-starter-data-jpa 等),自动配置好相应的组件,无需手写配置。

用法:注解在类上。

组合注解

@SpringBootApplication

描述:组合注解,主类入口,包含了@Configuration@EnableAutoConfiguration@ComponentScan

用法:注解在类上。

1
2
3
public static void main(String[] args) {
SpringApplication.run(StudentApplication.class, args);
}

SpringApplication.run会启动内置的Tomcat服务器;扫描整个项目;自动注册@Controller@Service@Repository等组件,运行时在本地监听8080端口。

@RestController

描述:包含了@Controller@ResponseBody

用法:注解在类上。

@RestControllerAdvice

描述:包含了@ControllerAdvice@ResponseBody

用法:注解在类上。

配置文件

作用:设置应用的全局属性和行为

server

port:设置服务器端口。

8080

spring

application

name:设置应用名称。

datasource

  • url:指定连接到Mysql数据库的地址和端口。

jdbc:mysql://localhost:3306/数据库名:默认。

  • driver-class-name:JDBC驱动程序的类名。

com.mysql.cj.jdbc.Driver

  • name
  • password

jpa

hibernate.ddl-auto:控制 Hibernate 在启动时对数据库表结构的自动更新行为。

update:如果有新的实体类或字段,Hibernate 会自动尝试更新数据库表结构,使其与实体类匹配。

create:每次启动应用时都会删除现有的数据库表,并根据实体类重新创建表格。

show-sql:用于开启在控制台显示执行的 SQL 语句。

true:开启。

依赖

spring-boot-starter-web

作用:集成了Web相关的所有常用依赖的启动器。

内容:

  • Spring Web;
  • Jackson:用于处理JSON的转换;
  • Tomcat:默认嵌入式容器。

spring-boot-starter-data-jpa

作用:集成了 Spring Data JPA 提供的 Repository 模式,能够通过接口操作数据库,无需手动编写实现类。

内容:

  • Spring Data JPA:提供接口减少数据库操作;
  • Hibernate:映射数据库中的表和Java对象的关系;

Bean方法

非核心配置Bean要用Autowired注入前,需要在配置类中提前配置。

核心配置

addInterceptors()

void addInterceptors(InterceptorRegistry registry)

作用:用于注册拦截器。

方法:

  • registry.addInterceptor(自定义的拦截器):添加哪些拦截器。
  • registry.addPathPatterns("/path"):拦截哪些路径。

SecurityFilterChain

作用:定义 HTTP 安全策略,即哪些URL需要认证;添加自定义过滤器,检查Token,返回过滤器链。

在这里实现登录Token认证之后,最好再加保存到浏览器中,例如HttpOnly Cookie

authenticationManager

作用:提供 SpringSecurity的核心认证管理器,处理身份验证。

过滤器

OncePerRequestFilter

作用:Spring 提供的基类,保证每个请求只执行一次过滤。

拦截器

preHandle()

boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

作用:在请求到达Controller前执行,如果返回 false,请求会被终止,不会进入后续的 Controller 或 postHandle()afterCompletion() 方法。

方法:

  • request.getMethod():返回请求方法(Get/Post)。
  • getRequestURI():返回请求路径。

服务层

PassEncoder

作用:SpringSecurity提供的密码加密器,用于对用户密码进行安全加密和验证。

方法:

  • String encode(rawPassword):把用户输入的明文密码加密成一段不可逆的哈希字符串。
  • boolean matches(rawPassword, encodedPassword):验证明文密码是否与数据库中的加密密码匹配。

Util

JwtUtil

作用:可以生成、解析和验证 token,封装用户信息,过期时间等,作为无状态的登录凭证。

注意生成/解析Token时使用Key对象,老版本的字符串密钥不兼容。

使用

持久层

CrudRepository

方法:

  • Iterable<T> findAll():表示查询结果的集合。

    可以直接转化为List<S>返回。

  • Page<T> findAll(Pageable pageable):分页查询。

    Page有以下属性:getSize():每页大小;getNumber():当前页索引。Pageable可以由PageRequest.of(page, size)来构造。

  • T save(T entity):根据实体是否有ID来执行插入或者更新操作,返回保存后的实体对象。

  • Optional<T> findById(id):从数据库中查询id的实体,并返回Optional类,可以存储一个实体,也可以表示没有值。

    配合orElseThrow()Optional的方法,如果有值则会返回值,无值则为抛出异常,例如可以配合Lambda表达式() -> new RuntimeException("xxx not found")

    findByNameContaining()Containing关键字可以实现按照模糊名查找。

  • void delete(T entity):根据实体删除。

    void deleteById(ID id)可以根据id删除。


SpringBoot
http://example.com/springBoot/
发布于
2025年11月12日
更新于
2025年11月12日
许可协议