面试题答案
一键面试1. 常见分层架构及职责
- Controller层:
- 职责:负责接收客户端的请求,对请求进行预处理(如参数校验),然后调用Service层的业务逻辑方法进行处理,最后将处理结果封装成合适的格式(如JSON)返回给客户端。它主要起到了用户请求与后端业务逻辑之间的桥梁作用。
- 示例:在一个用户管理系统中,Controller可能接收来自前端的添加用户请求,对请求中的用户信息(如用户名、密码等)进行简单校验,然后将请求转发给Service层处理。
- Service层:
- 职责:承载核心业务逻辑。它从Controller层接收请求,进行复杂的业务规则处理,可能涉及到多个数据操作、事务管理等。Service层会调用Repository层获取或持久化数据,并将处理后的结果返回给Controller层。
- 示例:还是在用户管理系统中,Service层在处理添加用户请求时,可能会先检查用户名是否已存在(调用Repository层查询数据库),如果不存在则进行添加操作,并使用事务确保添加操作的原子性。
- Repository层:
- 职责:负责与数据库进行交互,执行数据的持久化(如保存、更新)和查询操作。它提供了对数据访问的抽象,使得Service层不需要关心具体的数据库操作细节(如使用的是MySQL还是Oracle)。
- 示例:在用户管理系统中,Repository层会提供方法来执行SQL语句(如使用JPA的
save
方法保存用户数据到数据库,使用findByUsername
方法根据用户名查询用户信息)。
2. 层与层之间的交互
- Controller与Service交互:Controller通过调用Service层暴露的接口方法,将请求传递给Service层。Service层处理完业务逻辑后,返回处理结果给Controller。例如,Controller调用
UserService
的addUser(User user)
方法,Service层处理完添加用户逻辑后返回操作结果(成功或失败)给Controller。 - Service与Repository交互:Service层根据业务需求调用Repository层提供的数据访问方法。如
UserService
在处理用户查询业务时,调用UserRepository
的findByUsername(String username)
方法获取用户数据。
3. 通过依赖注入管理层与层之间的依赖关系
在Spring Boot中,通常使用注解方式实现依赖注入。
- Controller层注入Service:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
private final UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
@PostMapping("/users")
public String addUser(@RequestBody User user) {
return userService.addUser(user);
}
}
这里通过构造函数注入UserService
,Spring容器在创建UserController
实例时会自动注入UserService
的实例。
- Service层注入Repository:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Transactional
public String addUser(User user) {
if (userRepository.findByUsername(user.getUsername()) != null) {
return "用户名已存在";
}
userRepository.save(user);
return "用户添加成功";
}
}
同样,通过构造函数注入UserRepository
,Spring容器在创建UserService
实例时会注入UserRepository
的实例。这种依赖注入方式使得代码的可测试性和可维护性大大提高,同时也实现了松耦合。