SpringBoot
本文最后更新于 2025年10月20日 下午
SpringBoot
SpringBoot是一个Spring模块,提供了RAD(快速应用程序开发)功能。它用于创建独立的基于Spring的应用程序,需要最少的Spring配置就可以运行。
即Spring框架和嵌入式服务器的组合。
自动配置了 Web 服务、JSON 转换、Tomcat 服务器等,不用手动配置 XML。
即自带内嵌Tomcat的Java程序,运行后监听
localhost:8080
结构
| 层 | 作用 |
|---|---|
@SpringBootApplication |
主类,入口 |
| config | 配置类,用于全局配置,在启动时加载,注册拦截器等。 |
| interceptor | 请求到达controller之前/之后的公共逻辑。 |
| controller | 控制层,接受前端请求,并调用服务层。 |
| service | 服务层,处理业务逻辑,并调用持久层。 |
| repository | 持久层,操作数据库。 |
| model | 实体层,映射数据库表。 |
注解
@Component
作用:在组件扫描时,带有@Component及其衍生注解的类会被注册为Bean,通用组件,任何需要托管的类都可以用这个组件。
衍生注解:
@Service:服务层,处理业务逻辑。@Repository:持久层,处理数据库操作。@Controller:控制层,处理Web请求。@Configuration:配置类,注册Bean,有动态代理增强。
用法:注解在类上。
@Configuration
作用:配置类功能,可以用来定义Bean,相当于XML文件,允许在其下使用@Bean的注解来注册Bean到Spring容器。
本质也是个特殊的
@Component,会被组件扫描,会启用动态代理增强机制,保证多个@Bean之间安全相互调用,返回的是同一个Bean实例。
用法:注解在类上。
1 |
|
@ComponentScan
作用:组件扫描功能,注册标注了@Component等注解的类为Bean。
扫描范围默认为当前包及其子包的所有组件。
用法:注解在类上。
@Autowired
作用:用于将Spring容器内的某个Bean自动注入到另一个类的字段/构造器/方法。
自动注入是IOC(控制反转)的一部分,减少耦合,由Spring容器管理依赖关系。
用法:
- 注解在字段上;
1 |
|
- 注解在构造器上;
- 注解在Setter方法上
@Qualifier
作用:自动注入有多个类型匹配的Bean时,明确指定注入哪个Bean。
用法:和@Autowired一起注解。
@RequestMapping
作用:请求映射功能,可以映射URL路径,限定HTTP请求方法,匹配请求的其他属性。
用法:
- 注解在类上,定义公共前缀路径。
- 注解在方法上,定义具体路径和行为。
属性:
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等)的请求处理方法起作用。
1 |
|
@Entity
作用:JPA库中,标记当前类是一个实体类,对应数据库中的一张表,类下的字段对应表中的列。
用法:注解在类上。
@ID
作用:标识实体类的主键字段。
用法:注解在字段上。
@GeneratedValue
作用:搭配@ID,指定主键的生成策略。
属性:
strategy
GenerationType.IDENTITY:使用数据库的自增长策略来生成主键值。
用法:注解在字段上。
@Getter和@Setter
作用:Lombok库中,自动生成getter和setter方法。
用法:注解在类上。
@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。
用法:注解在类上。
配置文件
作用:设置应用的全局属性和行为
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对象的关系;
拦截器
addInterceptors()
void addInterceptors(InterceptorRegistry registry)
作用:用于注册拦截器。
方法:
registry.addInterceptor(自定义的拦截器):添加哪些拦截器。registry.addPathPatterns("/path"):拦截哪些路径。
preHandle()
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
作用:在请求到达Controller前执行,如果返回 false,请求会被终止,不会进入后续的 Controller 或 postHandle()、afterCompletion() 方法。
关键方法:
request.getMethod():返回请求方法(Get/Post)。getRequestURI():返回请求路径。
持久层
CrudRepository
findAll()
Iterable<T> findAll()
作用:表示查询结果的集合。
可以直接转化为
List<S>返回。
save()
S save(S entity)
作用:根据实体是否有ID来执行插入或者更新操作,返回保存后的实体对象。
findById()
Optional<S> findById(id)
作用:从数据库中查询id的实体,并返回Optional类,可以存储一个实体,也可以表示没有值。
配合
orElseThrow(),Optional的方法,如果有值则会返回值,无值则为抛出异常,例如可以配合Lambda表达式() -> new RuntimeException("xxx not found")。
delete()
void delete(T entity)
作用:根据实体删除。
void deleteById(ID id)可以根据id删除。