以下是一个基于Java项目分层架构实操指南等最新技术的Java项目分层架构实操指南,结合用户管理系统实例进行说明。
1. 项目架构设计
采用微服务架构,使用Spring Cloud套件实现服务治理,整体分层结构如下:
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注解支持。
// 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方法。
// 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层处理通用逻辑。
// 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层(通用业务)
封装第三方服务和通用操作,如缓存、消息队列等。
// 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请求,校验参数,返回统一格式结果。
// 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 统一返回结果封装
// 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配置
// 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 自动填充配置
// 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服务注册中心
// EurekaServerApplication.java @SpringBootApplication @EnableEurekaServer public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
5.2 Gateway网关配置
# application.yml spring: cloud: gateway: routes: - id: user-service uri: lb://user-service # 服务名 predicates: - Path=/api/users/** filters: - StripPrefix=1 # 去除路径前缀
6. 部署与测试
- 数据库初始化:创建
sys_user表,添加必要字段。 - 启动顺序:Eureka Server → Gateway → User Service。
- 接口测试:使用Postman或Swagger UI测试注册、登录接口。
// 注册请求示例 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项目分层架构的最佳实践:
- 高内聚低耦合:各层职责清晰,如Controller处理请求、Service处理业务、Mapper操作数据库。
- 可扩展性:通过接口和抽象类实现松耦合,便于后续功能扩展。
- 技术栈先进性:使用Spring Boot、MyBatis-Plus等简化开发,提升效率。
- 微服务架构:通过Spring Cloud实现服务治理,支持分布式系统。
建议在实际项目中根据需求调整架构,不需要完全遵循所有层次,保持"够用就好"的原则。
Java 项目分层架构,Spring Boot, 微服务架构,分层设计原则,后端开发,MyBatis, 领域驱动设计,项目架构案例,接口设计,服务分层,Spring Cloud, 架构优化,分层架构实战,Java 开发,系统架构设计
1056

被折叠的 条评论
为什么被折叠?



