首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java 项目分层架构实操详细指南与案例解析

Java 项目分层架构实操详细指南与案例解析

原创
作者头像
啦啦啦191
发布2025-07-08 13:36:01
发布2025-07-08 13:36:01
1980
举报
文章被收录于专栏:Java开发Java开发

以下是一个基于Java项目分层架构实操指南等最新技术的Java项目分层架构实操指南,结合用户管理系统实例进行说明。

1. 项目架构设计

采用微服务架构,使用Spring Cloud套件实现服务治理,整体分层结构如下:

代码语言:txt
复制
user-service/                  # 用户服务微服务
├── src/main/java/com/example
│   ├── controller/            # Web层(控制器)
│   ├── service/               # Service层(业务逻辑)
│   │   ├── impl/              # Service实现
│   ├── manager/               # Manager层(通用业务处理)
│   ├── mapper/                # Mapper层(数据访问)
│   ├── entity/                # 实体层
│   ├── dto/                   # 数据传输对象
│   ├── vo/                    # 视图对象
│   ├── config/                # 配置层
│   ├── utils/                 # 工具层
│   └── UserServiceApplication.java  # 启动类
└── src/main/resources
    ├── mapper/                # MyBatis映射文件
    ├── application.yml        # 配置文件

2. 技术选型

  • Web框架:Spring Boot 3.0 + Spring MVC
  • 服务注册与发现:Spring Cloud Netflix Eureka
  • API网关:Spring Cloud Gateway
  • ORM框架:MyBatis-Plus 3.5+
  • 数据库:MySQL 8.0 + Redis 7.0
  • 权限认证:Spring Security + JWT
  • 工具链:Maven 3.8、Lombok、Swagger 3.0

3. 核心层实现示例

3.1 实体层(Entity)

使用Lombok简化POJO开发,添加JPA注解支持。

代码语言:java
复制
// User.java
@Data
@TableName("sys_user")
@EqualsAndHashCode(callSuper = false)
public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    @TableId(type = IdType.AUTO)
    private Long id;

    @NotBlank(message = "用户名不能为空")
    private String username;

    @JsonIgnore  // 避免密码暴露
    private String password;

    private String email;

    @TableField(fill = FieldFill.INSERT)  // 自动填充创建时间
    private LocalDateTime createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)  // 自动填充更新时间
    private LocalDateTime updateTime;
}
3.2 Mapper层(数据访问)

继承MyBatis-Plus的BaseMapper接口,无需编写基础CRUD方法。

代码语言:java
复制
// UserMapper.java
@Mapper
public interface UserMapper extends BaseMapper<User> {
    // 自定义复杂查询方法
    @Select("SELECT * FROM sys_user WHERE username = #{username}")
    User selectByUsername(@Param("username") String username);
}
3.3 Service层(业务逻辑)

使用事务管理和缓存优化,调用Manager层处理通用逻辑。

代码语言:java
复制
// UserService.java
public interface UserService extends IService<User> {
    Result<Boolean> register(UserDTO userDTO);
    Result<UserVO> login(LoginDTO loginDTO);
}

// UserServiceImpl.java
@Service
@Transactional
@RequiredArgsConstructor  // Lombok生成构造器注入
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    private final RedisManager redisManager;
    private final PasswordEncoder passwordEncoder;
    private final JwtManager jwtManager;

    @Override
    public Result<Boolean> register(UserDTO userDTO) {
        // 1. 校验用户名唯一性(调用Manager层)
        if (userMapper.selectByUsername(userDTO.getUsername()) != null) {
            return Result.fail("用户名已存在");
        }

        // 2. 密码加密
        User user = BeanUtil.copyProperties(userDTO, User.class);
        user.setPassword(passwordEncoder.encode(userDTO.getPassword()));

        // 3. 保存用户
        boolean success = save(user);

        // 4. 注册成功后缓存用户信息
        if (success) {
            redisManager.setCacheObject(CacheConstants.USER_KEY + user.getId(), user);
        }
        return Result.ok(success);
    }

    @Override
    public Result<UserVO> login(LoginDTO loginDTO) {
        // 1. 查询用户
        User user = userMapper.selectByUsername(loginDTO.getUsername());
        
        // 2. 校验密码
        if (user == null || !passwordEncoder.matches(loginDTO.getPassword(), user.getPassword())) {
            return Result.fail("用户名或密码错误");
        }
        
        // 3. 生成JWT令牌
        String token = jwtManager.generateToken(user.getId().toString());
        
        // 4. 构建返回VO
        UserVO userVO = BeanUtil.copyProperties(user, UserVO.class);
        userVO.setToken(token);
        return Result.ok(userVO);
    }
}
3.4 Manager层(通用业务)

封装第三方服务和通用操作,如缓存、消息队列等。

代码语言:java
复制
// RedisManager.java
@Component
@RequiredArgsConstructor
public class RedisManager {
    private final RedisTemplate<String, Object> redisTemplate;

    public <T> void setCacheObject(String key, T value) {
        redisTemplate.opsForValue().set(key, value);
    }

    public <T> T getCacheObject(String key) {
        ValueOperations<String, Object> operations = redisTemplate.opsForValue();
        return (T) operations.get(key);
    }

    public Boolean deleteObject(String key) {
        return redisTemplate.delete(key);
    }
}

// JwtManager.java
@Component
@RequiredArgsConstructor
public class JwtManager {
    private static final String SECRET_KEY = "your-secret-key";
    private static final long EXPIRATION_TIME = 86400000; // 24小时

    public String generateToken(String userId) {
        return Jwts.builder()
                .setSubject(userId)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    public String getUserIdFromToken(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody()
                .getSubject();
    }
}
3.5 Controller层(Web接口)

处理HTTP请求,校验参数,返回统一格式结果。

代码语言:java
复制
// UserController.java
@RestController
@RequestMapping("/api/users")
@Api(tags = "用户管理")
@RequiredArgsConstructor
public class UserController {
    private final UserService userService;

    @PostMapping("/register")
    @ApiOperation("用户注册")
    public Result<Boolean> register(@RequestBody @Valid UserDTO userDTO) {
        return userService.register(userDTO);
    }

    @PostMapping("/login")
    @ApiOperation("用户登录")
    public Result<UserVO> login(@RequestBody @Valid LoginDTO loginDTO) {
        return userService.login(loginDTO);
    }

    @GetMapping("/{id}")
    @ApiOperation("获取用户详情")
    @PreAuthorize("hasAuthority('user:view')") // 权限校验
    public Result<UserVO> getUser(@PathVariable Long id) {
        User user = userService.getById(id);
        return Result.ok(BeanUtil.copyProperties(user, UserVO.class));
    }
}

4. 配置与工具类

4.1 统一返回结果封装
代码语言:java
复制
// Result.java
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Result<T> {
    private Integer code;
    private String message;
    private T data;

    public static <T> Result<T> ok(T data) {
        return new Result<>(200, "操作成功", data);
    }

    public static <T> Result<T> fail(String message) {
        return new Result<>(500, message, null);
    }
}
4.2 MyBatis-Plus配置
代码语言:java
复制
// MyBatisPlusConfig.java
@Configuration
public class MyBatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 分页插件
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        // 乐观锁插件
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }
}
4.3 自动填充配置
代码语言:java
复制
// MyMetaObjectHandler.java
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createTime", LocalDateTime::now, LocalDateTime.class);
        this.strictInsertFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
    }
}

5. 服务注册与网关配置

5.1 Eureka服务注册中心
代码语言:java
复制
// EurekaServerApplication.java
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}
5.2 Gateway网关配置
代码语言:yaml
复制
# application.yml
spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service  # 服务名
          predicates:
            - Path=/api/users/**
          filters:
            - StripPrefix=1  # 去除路径前缀

6. 部署与测试

  1. 数据库初始化:创建sys_user表,添加必要字段。
  2. 启动顺序:Eureka Server → Gateway → User Service。
  3. 接口测试:使用Postman或Swagger UI测试注册、登录接口。
代码语言:http
复制
// 注册请求示例
POST http://localhost:8080/api/users/register
{
  "username": "test",
  "password": "123456",
  "email": "test@example.com"
}

// 登录请求示例
POST http://localhost:8080/api/users/login
{
  "username": "test",
  "password": "123456"
}

7. 优化与扩展

  • 性能优化:添加Redis缓存、异步处理。
  • 监控告警:集成Prometheus + Grafana实现服务监控。
  • 链路追踪:使用Sleuth + Zipkin实现分布式链路追踪。
  • CI/CD:配置Jenkins或GitLab CI实现自动化部署。

总结

通过这个实操案例,你可以看到现代Java项目分层架构的最佳实践:

  1. 高内聚低耦合:各层职责清晰,如Controller处理请求、Service处理业务、Mapper操作数据库。
  2. 可扩展性:通过接口和抽象类实现松耦合,便于后续功能扩展。
  3. 技术栈先进性:使用Spring Boot、MyBatis-Plus等简化开发,提升效率。
  4. 微服务架构:通过Spring Cloud实现服务治理,支持分布式系统。

建议在实际项目中根据需求调整架构,不需要完全遵循所有层次,保持"够用就好"的原则。


Java 项目分层架构,Spring Boot, 微服务架构,分层设计原则,后端开发,架构案例解析,领域驱动设计,持久层设计,服务层架构,控制层实现,分层架构最佳实践,企业级应用架构,模块化开发,架构优化,Java 架构实战


原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 项目架构设计
  • 2. 技术选型
  • 3. 核心层实现示例
    • 3.1 实体层(Entity)
    • 3.2 Mapper层(数据访问)
    • 3.3 Service层(业务逻辑)
    • 3.4 Manager层(通用业务)
    • 3.5 Controller层(Web接口)
  • 4. 配置与工具类
    • 4.1 统一返回结果封装
    • 4.2 MyBatis-Plus配置
    • 4.3 自动填充配置
  • 5. 服务注册与网关配置
    • 5.1 Eureka服务注册中心
    • 5.2 Gateway网关配置
  • 6. 部署与测试
  • 7. 优化与扩展
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档