温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何设计Java Service服务

发布时间:2026-09-19 18:40:40 来源:亿速云 阅读:95 作者:小樊 栏目:编程语言

设计 Java Service 层(服务层)是后端架构中非常关键的一环,它介于 Controller(接口层) 和 DAO / Repository(数据层) 之间,负责业务逻辑、事务控制、领域规则。下面从 设计原则 → 分层结构 → 代码示例 → 常见模式 → 避坑指南 系统讲一下。


一、Service 层的核心职责

✅ 做什么:

  • 业务逻辑封装
  • 事务管理(@Transactional)
  • 多表 / 多 DAO 协作
  • 领域规则校验
  • 对外提供稳定接口

❌ 不做什么:

  • 不直接处理 HTTP(那是 Controller)
  • 不写 SQL(那是 Mapper / Repository)
  • 不处理 JSON 序列化细节

二、推荐的 Service 分层结构

1️⃣ 接口 + 实现(推荐)

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);
    }
}

✅ 优点:

  • 易扩展(多实现)
  • 易测试(Mock 接口)
  • 符合 SOLID

三、事务设计(非常重要)

1️⃣ 事务放在 Service 层

@Override
@Transactional(rollbackFor = Exception.class)
public void transferMoney(Long from, Long to, BigDecimal amount) {
    accountMapper.deduct(from, amount);
    accountMapper.add(to, amount);
}

2️⃣ 事务误区

❌ 在 Controller 加 @Transactional
❌ 一个 Service 方法做太多事(超过 50 行要警惕)


四、Service 方法设计原则

✅ 单一职责

// ❌ 反例
public void createOrderAndSendEmailAndPush();

// ✅ 正例
public void createOrder();
public void sendEmail();

✅ 入参使用 DTO / Command

public void createUser(CreateUserCommand command);

✅ 返回 DTO,而不是 Entity

UserDTO getUser(Long id);

五、常见 Service 设计模式

1️⃣ 领域 Service(业务逻辑重)

@Service
public class OrderService {
    // 复杂订单逻辑
}

2️⃣ 应用 Service(编排)

@Service
public class UserApplicationService {
    private final UserService userService;
    private final EmailService emailService;
}

3️⃣ 策略模式(避免 if-else)

public interface PaymentStrategy {
    void pay();
}

六、Service 命名建议

类型 命名
业务服务 UserService
应用服务 UserApplicationService
领域服务 OrderDomainService
只读服务 UserQueryService

七、Service 层常见错误 ❌

❌ Service 直接返回 Entity
❌ Service 里写 new Scanner(System.in)
❌ 一个方法 200 行
❌ 滥用 @Transactional
❌ Service 调用 Controller


八、一个标准示例(Spring Boot)

@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);
    }
}

九、进阶建议

  • DDD:Service 拆分为 Application / Domain
  • CQRS:读写 Service 分离
  • 事件驱动:ApplicationEventPublisher

如果你愿意,可以告诉我:

  • 用的是 Spring Boot / Spring Cloud / 普通 Java
  • 是 单体 / 微服务
  • 当前 Service 代码是否存在问题

我可以直接帮你 重构或设计一个完整 Service 结构。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手