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
2
3
4
5
6
7
@Configuration
public class xxx{
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}

@ComponentScan

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

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

用法:注解在类上。

@Autowired

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

自动注入是IOC(控制反转)的一部分,减少耦合,由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路径,限定HTTP请求方法,匹配请求的其他属性。

用法:

  • 注解在类上,定义公共前缀路径。
  • 注解在方法上,定义具体路径和行为。

属性:

  • 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等)的请求处理方法起作用。

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

@Entity

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

用法:注解在类上。

@ID

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

用法:注解在字段上。

@GeneratedValue

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

属性:

  • strategy

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

用法:注解在字段上。

@Getter@Setter

作用:Lombok库中,自动生成getter和setter方法。

用法:注解在类上。

@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

用法:注解在类上。

配置文件

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

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对象的关系;

拦截器

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删除。


SpringBoot
http://example.com/2025/09/03/springboot/
发布于
2025年9月3日
更新于
2025年10月20日
许可协议