Loading...
Loading...
Compare original and translation side by side
package com.example.{module}.{layer};
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.{Annotation};
import org.springframework.transaction.annotation.Transactional;
/**
* {Class purpose and responsibility}
*
* <p>Key features:
* <ul>
* <li>Feature 1</li>
* <li>Feature 2</li>
* </ul>
*
* @author Enterprise Java Developer
* @since {Version}
*/
@Slf4j
@RequiredArgsConstructor
@{Annotation}
public class {ClassName} {
private final Dependency dependency;
/**
* {Method purpose}
*
* @param param parameter description
* @return return value description
* @throws BusinessException when business rules violated
*/
@Transactional(rollbackFor = Exception.class)
public Result methodName(Param param) {
log.info("Method started, param: {}", param);
try {
// 1. Validate input
validateParam(param);
// 2. Execute business logic
Result result = executeBusinessLogic(param);
// 3. Return result
log.info("Method completed successfully");
return result;
} catch (BusinessException e) {
log.error("Business error: {}", e.getMessage(), e);
throw e;
} catch (Exception e) {
log.error("System error occurred", e);
throw new SystemException("Unexpected error", e);
}
}
private void validateParam(Param param) {
if (param == null) {
throw new IllegalArgumentException("Param cannot be null");
}
// Additional validations...
}
private Result executeBusinessLogic(Param param) {
// Implementation...
return new Result();
}
}package com.example.{module}.{layer};
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.{Annotation};
import org.springframework.transaction.annotation.Transactional;
/**
* {类的用途与职责}
*
* <p>核心特性:
* <ul>
* <li>特性1</li>
* <li>特性2</li>
* </ul>
*
* @author 企业级Java开发者
* @since {版本号}
*/
@Slf4j
@RequiredArgsConstructor
@{Annotation}
public class {ClassName} {
private final Dependency dependency;
/**
* {方法用途}
*
* @param param 参数描述
* @return 返回值描述
* @throws BusinessException 违反业务规则时抛出
*/
@Transactional(rollbackFor = Exception.class)
public Result methodName(Param param) {
log.info("方法启动,参数: {}", param);
try {
// 1. 校验输入
validateParam(param);
// 2. 执行业务逻辑
Result result = executeBusinessLogic(param);
// 3. 返回结果
log.info("方法执行成功");
return result;
} catch (BusinessException e) {
log.error("业务错误: {}", e.getMessage(), e);
throw e;
} catch (Exception e) {
log.error("发生系统错误", e);
throw new SystemException("意外错误", e);
}
}
private void validateParam(Param param) {
if (param == null) {
throw new IllegalArgumentException("参数不能为空");
}
// 额外校验...
}
private Result executeBusinessLogic(Param param) {
// 实现逻辑...
return new Result();
}
}controller/ - HTTP endpoints, request/response handling
├── dto/ - Data Transfer Objects
└── vo/ - View Objects
service/ - Business logic, orchestration
├── impl/ - Service implementations
repository/ - Data access layer
├── entity/ - JPA entities
└── mapper/ - MyBatis mappers
domain/ - Domain models (DDD)
├── model/ - Domain objects
├── service/ - Domain services
└── event/ - Domain events
config/ - Configuration classes
exception/ - Custom exceptions
util/ - Utility classes
constant/ - Constants and enumscontroller/ - HTTP端点、请求/响应处理
├── dto/ - 数据传输对象
└── vo/ - 视图对象
service/ - 业务逻辑、编排
├── impl/ - 服务实现类
repository/ - 数据访问层
├── entity/ - JPA实体类
└── mapper/ - MyBatis映射器
domain/ - 领域模型(DDD)
├── model/ - 领域对象
├── service/ - 领域服务
└── event/ - 领域事件
config/ - 配置类
exception/ - 自定义异常
util/ - 工具类
constant/ - 常量与枚举undefinedundefined// Improved versionundefined// 优化后的版本undefinedundefinedundefined[Component A] --> [Component B]
[Component B] --> [Component C][组件A] --> [组件B]
[组件B] --> [组件C]// Key entities// 核心实体类undefinedundefinedundefinedundefined// Before
public List<User> getUsersWithOrders() {
List<User> users = userRepository.findAll();
users.forEach(user -> user.getOrders().size()); // N queries
return users;
}
// After
public List<User> getUsersWithOrders() {
return userRepository.findAllWithOrders(); // 1 query
}
// Repository
@Query("SELECT u FROM User u LEFT JOIN FETCH u.orders")
List<User> findAllWithOrders();// 优化前
public List<User> getUsersWithOrders() {
List<User> users = userRepository.findAll();
users.forEach(user -> user.getOrders().size()); // N次查询
return users;
}
// 优化后
public List<User> getUsersWithOrders() {
return userRepository.findAllWithOrders(); // 1次查询
}
// 仓库层代码
@Query("SELECT u FROM User u LEFT JOIN FETCH u.orders")
List<User> findAllWithOrders();@Cacheable(value = "users", key = "#userId")
public User getUser(Long userId) {
return userRepository.findById(userId)
.orElseThrow(() -> new UserNotFoundException(userId));
}@Cacheable(value = "users", key = "#userId")
public User getUser(Long userId) {
return userRepository.findById(userId)
.orElseThrow(() -> new UserNotFoundException(userId));
}undefinedundefinedundefinedundefinedjava.lang.OutOfMemoryError: Java heap space
at ArrayList.grow()
at OrderService.exportAllOrders()java.lang.OutOfMemoryError: Java heap space
at ArrayList.grow()
at OrderService.exportAllOrders()exportAllOrders()// Problematic code
public List<Order> exportAllOrders() {
return orderRepository.findAll(); // Loads 1M+ records
}exportAllOrders()// 问题代码
public List<Order> exportAllOrders() {
return orderRepository.findAll(); // 加载100万+条记录
}-Xmx4g -Xms4g-Xmx4g -Xms4gpublic void exportAllOrders(OutputStream output) {
int pageSize = 1000;
int page = 0;
Page<Order> orderPage;
do {
orderPage = orderRepository.findAll(
PageRequest.of(page++, pageSize)
);
writeToStream(orderPage.getContent(), output);
} while (orderPage.hasNext());
}public void exportAllOrders(OutputStream output) {
int pageSize = 1000;
int page = 0;
Page<Order> orderPage;
do {
orderPage = orderRepository.findAll(
PageRequest.of(page++, pageSize)
);
writeToStream(orderPage.getContent(), output);
} while (orderPage.hasNext());
}@Scheduled(fixedRate = 60000)
public void checkMemoryUsage() {
MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
long used = memoryBean.getHeapMemoryUsage().getUsed();
long max = memoryBean.getHeapMemoryUsage().getMax();
if (used > max * 0.8) {
log.warn("High memory usage: {}%", (used * 100 / max));
}
}undefined@Scheduled(fixedRate = 60000)
public void checkMemoryUsage() {
MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
long used = memoryBean.getHeapMemoryUsage().getUsed();
long max = memoryBean.getHeapMemoryUsage().getMax();
if (used > max * 0.8) {
log.warn("内存使用率过高: {}%", (used * 100 / max));
}
}undefined// ❌ Bad
try {
service.process();
} catch (Exception e) {
e.printStackTrace();
}
// ✅ Good
try {
service.process();
} catch (BusinessException e) {
log.warn("Business validation failed: {}", e.getMessage());
throw e;
} catch (Exception e) {
log.error("Unexpected error in process", e);
throw new SystemException("Processing failed", e);
}// ❌ 错误示例
try {
service.process();
} catch (Exception e) {
e.printStackTrace();
}
// ✅ 正确示例
try {
service.process();
} catch (BusinessException e) {
log.warn("业务校验失败: {}", e.getMessage());
throw e;
} catch (Exception e) {
log.error("流程执行出现意外错误", e);
throw new SystemException("流程执行失败", e);
}// ❌ Bad
public String getUserName(User user) {
return user.getName();
}
// ✅ Good
public String getUserName(User user) {
return Optional.ofNullable(user)
.map(User::getName)
.orElse("Unknown");
}// ❌ 错误示例
public String getUserName(User user) {
return user.getName();
}
// ✅ 正确示例
public String getUserName(User user) {
return Optional.ofNullable(user)
.map(User::getName)
.orElse("未知");
}// ❌ Bad
InputStream is = new FileInputStream(file);
// forgot to close
// ✅ Good
try (InputStream is = new FileInputStream(file)) {
// use stream
} // automatically closed// ❌ 错误示例
InputStream is = new FileInputStream(file);
// 忘记关闭
// ✅ 正确示例
try (InputStream is = new FileInputStream(file)) {
// 使用流
} // 自动关闭// ❌ Bad
private static final String API_URL = "http://api.example.com";
// ✅ Good
@Value("${api.url}")
private String apiUrl;// ❌ 错误示例
private static final String API_URL = "http://api.example.com";
// ✅ 正确示例
@Value("${api.url}")
private String apiUrl;// ❌ Bad
System.out.println("User: " + user);
log.debug("Processing order: " + order.getId());
// ✅ Good
log.info("User operation started, userId: {}", user.getId());
log.debug("Processing order, orderId: {}", order.getId());// ❌ 错误示例
System.out.println("User: " + user);
log.debug("Processing order: " + order.getId());
// ✅ 正确示例
log.info("用户操作开始,userId: {}", user.getId());
log.debug("处理订单,orderId: {}", order.getId());// ❌ Wrong: Transaction in loop
public void updateUsers(List<User> users) {
for (User user : users) {
updateUser(user); // Each call opens/closes transaction
}
}
// ✅ Correct: Single transaction
@Transactional
public void updateUsers(List<User> users) {
for (User user : users) {
userRepository.save(user);
}
}// ❌ 错误:循环中开启事务
public void updateUsers(List<User> users) {
for (User user : users) {
updateUser(user); // 每次调用开启/关闭事务
}
}
// ✅ 正确:单事务处理
@Transactional
public void updateUsers(List<User> users) {
for (User user : users) {
userRepository.save(user);
}
}// ❌ LazyInitializationException
@Transactional
public User getUser(Long id) {
return userRepository.findById(id).orElse(null);
}
// Later: user.getOrders() fails - no session
// ✅ Fetch needed data
@Transactional
public User getUserWithOrders(Long id) {
return userRepository.findByIdWithOrders(id).orElse(null);
}// ❌ 抛出LazyInitializationException
@Transactional
public User getUser(Long id) {
return userRepository.findById(id).orElse(null);
}
// 后续操作:user.getOrders() 失败 - 无会话
// ✅ 预加载所需数据
@Transactional
public User getUserWithOrders(Long id) {
return userRepository.findByIdWithOrders(id).orElse(null);
}// ❌ Stale cache after update
@Cacheable("users")
public User getUser(Long id) { ... }
public void updateUser(User user) {
userRepository.save(user);
// Cache still has old data!
}
// ✅ Invalidate cache
@CacheEvict(value = "users", key = "#user.id")
public void updateUser(User user) {
userRepository.save(user);
}// ❌ 更新后缓存过期
@Cacheable("users")
public User getUser(Long id) { ... }
public void updateUser(User user) {
userRepository.save(user);
// 缓存仍保留旧数据!
}
// ✅ 失效缓存
@CacheEvict(value = "users", key = "#user.id")
public void updateUser(User user) {
userRepository.save(user);
}