目录
Spring Boot 实战篇(三):构建基础控制器与服务层
在完成项目的基础搭建后,接下来需要构建基础的控制器(Controller)与服务层(Service),以实现业务逻辑的初步处理和与前端的交互。以下将详细介绍具体步骤及代码示例。
一、创建基础控制器(Controller)
(一)定义控制器类
- 创建包和类
- 在项目的
com.example.myproject.controller
包下(假设项目包名为com.example.myproject
)创建一个名为UserController
的控制器类,用于处理与用户相关的请求。
- 在项目的
- 添加注解和依赖注入
- 使用
@RestController
注解标识该类为一个 RESTful 风格的控制器,它结合了@Controller
和@ResponseBody
的功能,意味着控制器中的方法返回值将直接作为响应体返回给客户端,而不是解析为视图名。 - 使用
@Autowired
注解注入服务层接口(假设已经创建了UserService
接口),以便在控制器中调用服务层的方法来处理业务逻辑。 - 代码示例:
- 使用
package com.example.myproject.controller;
import com.example.myproject.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Autowired
private UserService userService;
}
(二)添加请求处理方法
- 查询用户列表方法
- 在
UserController
中添加一个方法用于查询用户列表。使用@GetMapping
注解标识该方法处理 HTTP GET 请求,请求路径为/users
。 - 在方法中调用服务层的
getAllUsers
方法(假设UserService
中有此方法)获取用户列表,并将结果返回给前端。 - 代码示例:
- 在
import com.example.myproject.entity.User;
import com.example.myproject.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/users")
public List<User> getUsers() {
return userService.getAllUsers();
}
}
- 根据 ID 查询用户方法(可选)
- 可以添加一个根据用户 ID 查询用户的方法。使用
@GetMapping
注解,请求路径为/users/{id}
,其中{id}
是路径变量。 - 使用
@PathVariable
注解获取路径变量的值,并将其传递给服务层的getUserById
方法(假设UserService
中有此方法)。 - 代码示例:
- 可以添加一个根据用户 ID 查询用户的方法。使用
@GetMapping("/users/{id}")
public User getUserById(@PathVariable Long id) {
return userService.getUserById(id);
}
二、创建基础服务层(Service)接口和实现类
(一)定义服务层接口
- 创建接口
- 在
com.example.myproject.service
包下创建UserService
接口,用于定义与用户相关的业务逻辑方法。
- 在
- 声明方法签名
- 例如,声明
getAllUsers
方法用于获取所有用户列表,getUserById
方法用于根据用户 ID 获取用户信息。 - 代码示例:
- 例如,声明
package com.example.myproject.service;
import com.example.myproject.entity.User;
import java.util.List;
public interface UserService {
List<User> getAllUsers();
User getUserById(Long id);
}
(二)创建服务层实现类
- 实现接口
- 在
com.example.myproject.service.impl
包下创建UserServiceImpl
类,实现UserService
接口。
- 在
- 注入数据访问层接口(DAO)
- 使用
@Autowired
注解注入UserDao
接口(假设已经创建了UserDao
用于数据访问),以便在服务层中调用数据访问层的方法与数据库交互。
- 使用
- 实现接口方法
- 在
getAllUsers
方法中,调用UserDao
的findAll
方法获取用户列表并返回。 - 在
getUserById
方法中,调用UserDao
的findById
方法根据 ID 获取用户信息并返回。 - 代码示例:
- 在
package com.example.myproject.service.impl;
import com.example.myproject.dao.UserDao;
import com.example.myproject.entity.User;
import com.example.myproject.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public List<User> getAllUsers() {
return userDao.findAll();
}
@Override
public User getUserById(Long id) {
return userDao.findById(id);
}
}
(三)处理业务逻辑(可扩展)
- 添加业务逻辑验证(示例)
- 在
getUserById
方法中,可以添加一些业务逻辑验证,例如判断用户 ID 是否合法(大于 0)。如果不合法,可以抛出一个自定义的异常(假设创建了InvalidUserIdException
异常类)。 - 代码示例:
- 在
@Override
public User getUserById(Long id) {
if (id <= 0) {
throw new InvalidUserIdException("无效的用户ID");
}
return userDao.findById(id);
}
- 事务管理(如果涉及数据库事务操作)
- 如果在服务层方法中存在多个数据库操作,且这些操作需要在一个事务中执行,可以使用 Spring 的事务管理功能。在服务层实现类或方法上添加
@Transactional
注解来开启事务支持。例如,如果有一个用户注册方法涉及插入用户信息和更新相关统计信息两个数据库操作,可以这样实现:
- 如果在服务层方法中存在多个数据库操作,且这些操作需要在一个事务中执行,可以使用 Spring 的事务管理功能。在服务层实现类或方法上添加
@Transactional
public void registerUser(User user) {
userDao.insert(user);
// 假设还有一个统计信息表,更新注册用户数量
statisticsDao.incrementRegisteredUserCount();
}
通过以上步骤,我们构建了基础的控制器和服务层,实现了简单的用户数据查询功能,并可以在此基础上进一步扩展和完善业务逻辑,如添加用户注册、登录、更新等功能,以及处理更复杂的业务规则和数据验证。同时,合理的服务层设计有助于提高代码的可维护性和可扩展性,将业务逻辑与数据访问和控制器分离,便于项目的开发和维护。