Spring Boot 是一个基于 Spring 框架的开源项目,用于简化 Spring 应用程序开发。它通过提供默认配置和预先配置的设置,使得开发生产级别的应用程序更加容易和快速。

Spring Boot 的主要特性

  1. 自动配置 (Auto-Configuration): Spring Boot 可以根据项目中包含的依赖自动配置 Spring 应用程序,这减少了大量的手动配置工作。
  2. 独立运行 (Standalone): Spring Boot 应用程序可以打包成 JAR 文件并且可以直接运行,不需要外部的应用服务器。这是通过内嵌的 Tomcat、Jetty 或者 Undertow 实现的。
  3. 生产准备 (Production-Ready): Spring Boot 提供了多种生产环境的特性,如监控、健康检查和外部化配置等,这使得应用程序更易于部署和维护。
  4. 简化的构建和开发 (Simplified Build and Development): 使用 Spring Boot,可以通过简化的项目设置和减少的配置来加快开发过程。常见的开发任务(如依赖管理、测试和部署)变得更加简便。
  5. Spring Boot Starter: Spring Boot 提供了一系列预定义的 “starter” 依赖集合,开发者可以根据需要选择不同的 starter,这些 starter 包含了构建特定类型应用程序所需的所有依赖。

这段代码是一个使用Spring Boot构建的简单REST控制器,定义了一个RESTful API的端点。以下是对代码的详细分析和讲解:

分析代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.tutorial.bootdemo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;

@RestController
public class TestController {

@GetMapping("/hello")
public List<String> hello() {
return List.of("hello", "world");
}
}

讲解

  1. 包声明

    1
    package com.tutorial.bootdemo;
    • 定义了这个类所在的包。Java中的包用于组织类和接口,防止命名冲突。
  2. 导入语句

    1
    2
    3
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    import java.util.List;
    • GetMappingRestController 是Spring Web中的注解,分别用于映射HTTP GET请求和标识REST控制器。
    • List 是Java集合框架中的接口,代表一个有序的集合。
  3. 类声明和注解

    1
    2
    @RestController
    public class TestController {
    • @RestController 注解表示这是一个Spring MVC的控制器,它处理HTTP请求并且返回的数据会直接写入HTTP响应体(通常是JSON格式)。
    • public class TestController 声明了一个名为TestController的公共类。
  4. 方法声明和注解

    1
    2
    3
    4
    @GetMapping("/hello")
    public List<String> hello() {
    return List.of("hello", "world");
    }
    • @GetMapping("/hello") 注解用于将HTTP GET请求映射到 hello 方法,路径为 /hello
    • public List<String> hello() 声明了一个返回类型为 List<String> 的公共方法 hello
    • return List.of("hello", "world"); 返回一个包含 “hello” 和 “world” 的列表。List.of 是Java 9引入的一个方便的方法,用于创建不可变的列表。

      spring boot程序层次

      在Spring Boot框架中,应用程序通常分为多个层次,每个层次都有特定的职责和功能。常见的分层结构包括DAO层、Service层和Controller层等。以下是每个层的详细功能:

1. Controller 层

功能:

  • 处理HTTP请求并返回响应。
  • 负责将客户端请求分发到适当的Service层方法。
  • 进行简单的数据验证。
  • 将业务逻辑结果封装为HTTP响应返回给客户端。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@RestController
@RequestMapping("/api")
public class UserController {

@Autowired
private UserService userService;

@GetMapping("/users/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
User user = userService.findUserById(id);
return ResponseEntity.ok(user);
}

@PostMapping("/users")
public ResponseEntity<User> createUser(@RequestBody User user) {
User createdUser = userService.saveUser(user);
return ResponseEntity.status(HttpStatus.CREATED).body(createdUser);
}
}

2. Service 层

功能:

  • 包含业务逻辑。
  • 从DAO层获取数据,并进行业务处理。
  • 处理事务逻辑(例如,开始和提交事务)。
  • 将处理后的数据返回给Controller层。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Service
public class UserService {

@Autowired
private UserRepository userRepository;

public User findUserById(Long id) {
return userRepository.findById(id).orElse(null);
}

public User saveUser(User user) {
return userRepository.save(user);
}

// 更多业务方法
}

3. DAO 层(Repository 层)

功能:

  • 直接与数据库进行交互。
  • 执行CRUD操作(创建、读取、更新、删除)。
  • 通常使用Spring Data JPA或其他持久化框架来简化数据库操作。

示例代码:

1
2
3
4
5
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
// 可以定义自定义查询方法,例如:
List<User> findByLastName(String lastName);
}

4. Model 层(实体层)

功能:

  • 定义应用程序的核心数据结构。
  • 与数据库表结构映射。
  • 包含字段、关系和数据验证注解。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
@Entity
public class User {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String firstName;
private String lastName;
private String email;

// Getters and setters
}

5. DTO 层(可选)

功能:

  • 数据传输对象,用于在不同层之间传递数据。
  • 封装复杂的数据结构,避免直接暴露实体对象。
  • 可以通过DTO进行输入输出数据的转换和验证。

示例代码:

1
2
3
4
5
6
7
8
9
public class UserDTO {

private Long id;
private String firstName;
private String lastName;
private String email;

// Getters and setters
}

6. 配置层(可选)

功能:

  • 配置应用程序的各项设置,如数据库配置、安全配置等。
  • 通过注解和Java类定义配置项。

示例代码:

1
2
3
4
5
6
7
8
@Configuration
public class AppConfig {

@Bean
public ModelMapper modelMapper() {
return new ModelMapper();
}
}

7. 异常处理层(可选)

功能:

  • 统一处理应用程序中的异常。
  • 向客户端返回一致的错误响应。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
@ControllerAdvice
public class GlobalExceptionHandler {

@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<ErrorResponse> handleResourceNotFoundException(ResourceNotFoundException ex) {
ErrorResponse errorResponse = new ErrorResponse(HttpStatus.NOT_FOUND.value(), ex.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.NOT_FOUND);
}

// 更多异常处理方法
}

通过这种分层结构,可以提高代码的可维护性、可读性和可扩展性,同时也使得职责更加清晰,每个层次专注于处理特定的任务。

其他

JpaRepository继承链中的重要方法

  • save(S entity):保存或更新实体。
  • findById(ID id):根据ID查找实体。
  • findAll():查找所有实体。
  • deleteById(ID id):根据ID删除实体。
  • count():统计实体的数量。

自定义查询方法

Spring Data JPA可以根据方法名自动生成查询。你的接口中定义的自定义查询方法有:

1
2
User findByUsername(String username);
User findByEmail(String email);

这些方法会自动生成相应的SQL查询,比如:

  • findByUsername(String username)会生成类似于SELECT * FROM users WHERE username = ?的查询。
  • findByEmail(String email)会生成类似于SELECT * FROM users WHERE email = ?的查询。