设计 Java Service 层(服务层)是后端架构中非常关键的一环,它介于 Controller(接口层) 和 DAO / Repository(数据层) 之间,负责业务逻辑、事务控制、领域规则。下面从 设计原则 → 分层结构 → 代码示例 → 常见模式 → 避坑指南 系统讲一下。
✅ 做什么:
@Transactional)❌ 不做什么:
public interface UserService {
UserDTO getUserById(Long id);
void registerUser(UserCreateRequest request);
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public UserDTO getUserById(Long id) {
User user = userMapper.selectById(id);
return UserConverter.toDTO(user);
}
}
✅ 优点:
@Override
@Transactional(rollbackFor = Exception.class)
public void transferMoney(Long from, Long to, BigDecimal amount) {
accountMapper.deduct(from, amount);
accountMapper.add(to, amount);
}
❌ 在 Controller 加 @Transactional
❌ 一个 Service 方法做太多事(超过 50 行要警惕)
// ❌ 反例
public void createOrderAndSendEmailAndPush();
// ✅ 正例
public void createOrder();
public void sendEmail();
public void createUser(CreateUserCommand command);
UserDTO getUser(Long id);
@Service
public class OrderService {
// 复杂订单逻辑
}
@Service
public class UserApplicationService {
private final UserService userService;
private final EmailService emailService;
}
public interface PaymentStrategy {
void pay();
}
| 类型 | 命名 |
|---|---|
| 业务服务 | UserService |
| 应用服务 | UserApplicationService |
| 领域服务 | OrderDomainService |
| 只读服务 | UserQueryService |
❌ Service 直接返回 Entity
❌ Service 里写 new Scanner(System.in)
❌ 一个方法 200 行
❌ 滥用 @Transactional
❌ Service 调用 Controller
@Service
@RequiredArgsConstructor
public class UserServiceImpl implements UserService {
private final UserRepository userRepository;
@Override
@Transactional
public UserDTO createUser(CreateUserCommand command) {
if (userRepository.existsByEmail(command.email())) {
throw new BusinessException("邮箱已存在");
}
User user = User.create(command);
userRepository.save(user);
return UserDTO.from(user);
}
}
ApplicationEventPublisher如果你愿意,可以告诉我:
我可以直接帮你 重构或设计一个完整 Service 结构。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。