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 |
|
- 注解在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 |
|
@PathVariable
作用:从请求的URL路径中提取参数值,传递到处理方法的参数中。
用法:注解在形参上。
如果有多个时,如下。
1 |
|
@RequestParam
作用:从请求的URL查询字符串中提取参数(?key=value),传递到处理方法的参数中。
用法:注解在形参上。
1 |
|
属性:
value/name:指定查询字符串的参数名。required:是否必须提供。
true(默认)
defaultValue:参数缺失时的默认值。
@RequestBody
作用:接收客户端发送的JSON数据并转化为对象。
用法:注解在形参上。
@ResponseBody
作用:方法的返回值会直接写入HTTP响应体,返回JSON或XML数据。
用法:注解在方法上。
在带有
@Controller或组合注解标记的类下,对带有@RequestMapping及其衍生注解(如@GetMapping、@PostMapping等)的请求处理方法起作用。不过一半可以直接
@RestController。
1 |
|
异常类
@ControllerAdvice
作用:让该类能拦截并处理全局 Controller
层的异常,当项目中任意一个控制类抛出异常时,Spring
会自动把异常传递到这里匹配对应的 @ExceptionHandler。
用法:注解在类上。
@ExceptionHandler
作用:当抛出特定类型的异常时,匹配这个方法。
用法:注解在方法上。
实体类
@Entity
作用:JPA库中,标记当前类是一个实体类,对应数据库中的一张表,类下的字段对应表中的列。
用法:注解在类上。
@ID
作用:标识实体类的主键字段。
用法:注解在字段上。
@GeneratedValue
作用:搭配@ID,指定主键的生成策略。
属性:
strategy
GenerationType.IDENTITY:使用数据库的自增长策略来生成主键值。
用法:注解在字段上。
@JsonIdentityInfo
作用:避免双向关系导致的无限递归,在序列化时,如果一个对象已经被序列化过了,就只输出它的标识属性。
用法:注解在类上。
属性:
generator:指定如何生成对象的唯一标识。ObjectIdGenerators.PropertyGenerator.classproperty:指定哪个字段作为唯一标识,一般是id。
@OneToMany
作用:表示一对多的关系,多的将会在数据库中添加一个外键用来指向一的键。
用法:注解在字段上。
属性:
mappedBy:表示这一方不是维护关系的一方,没有外键。通常就是这个类。
cascade:级联操作,对一做数据库操作时会传递到多的数据库中。CascadeType.ALLorphanRemoval:是否移除多的一方的孤儿对象。true时表示移除孤儿对象。例如:
owner类中的pets字段1
2
private Collection<Pet> pets = new ArrayList<>();
@ManyToOne
作用:表示多对一的关系。
用法:注解在字段上。
@JoinColumn
作用:指定外键列。
用法:注解在字段上。
属性:
name:生成外键列的名字。
通用类
@Data
作用:Lombok库,包括@Getter,@Setter,@ToString,@EqualsAndHashCode,@RequiredArgsConstructor方法。
用法:注解在类上。
@NoArgsConstructor和@AllArgsConstructor也是Lombok库中,可以自动生成无参构造和全参构造。
@EnableAutoConfiguration
作用:自动配置功能,会根据所添加的依赖如spring-boot-starter-web,spring-boot-starter-data-jpa
等),自动配置好相应的组件,无需手写配置。
用法:注解在类上。
组合注解
@SpringBootApplication
描述:组合注解,主类入口,包含了@Configuration,@EnableAutoConfiguration,@ComponentScan。
用法:注解在类上。
1 | public static void main(String[] 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
namepassword
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删除。