以下是一个基于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,Spring Cloud, 微服务架
代码获取方式
https://pan.quark.cn/s/14fcf913bae6