Spring 设计模式全解析:从 IOC 到 AOP 的模式之美是软件工程中解决特定问题的经典方案,它提供了可复用的设计思路和代码结构。
本文深入分析了Spring 设计模式全解析:从 IOC 到 AOP 的模式之美的适用场景、优缺点和实现方式,是提升代码质量的重要参考。
Spring 的 Bean 默认就是单例的:
@Service
public class UserService {
// 整个容器中只有一个 UserService 实例
}
Spring 设计模式全解析:从 IOC 到 AOP 的模式之美是软件工程中解决特定问题的经典方案,它提供了可复用的设计思路和代码结构。
本文深入分析了Spring 设计模式全解析:从 IOC 到 AOP 的模式之美的适用场景、优缺点和实现方式,是提升代码质量的重要参考。
Spring 的 Bean 默认就是单例的:
@Service
public class UserService {
// 整个容器中只有一个 UserService 实例
}
DDD 入门指南:从贫血模型到领域驱动是系统设计的核心,它决定了系统的可扩展性、可靠性和可维护性。
本文介绍了DDD 入门指南:从贫血模型到领域驱动的设计原则和实践经验,帮助你提升架构设计能力。
假设我们正在开发一个担保业务系统,有一个"客户申请授信额度"的功能。按照传统的三层架构,代码大致是这样的:
// Controller 层
@RestController
@RequestMapping("/api/credit")
public class CreditController {
@Autowired
private CreditService creditService;
@PostMapping("/apply")
public Result<CreditApplyResponse> apply(@RequestBody CreditApplyRequest request) {
return Result.success(creditService.apply(request));
}
}
// Service 层
@Service
public class CreditService {
@Autowired
private CustomerMapper customerMapper;
@Autowired
private CreditRecordMapper creditRecordMapper;
@Autowired
private RiskEngineClient riskEngineClient;
@Transactional
public CreditApplyResponse apply(CreditApplyRequest request) {
// 1. 查询客户信息
CustomerDO customer = customerMapper.selectById(request.getCustomerId());
if (customer == null) {
throw new BusinessException("客户不存在");
}
// 2. 校验客户状态
if (!"ACTIVE".equals(customer.getStatus())) {
throw new BusinessException("客户状态异常,无法申请授信");
}
// 3. 校验是否已有有效授信
CreditRecordDO existingCredit = creditRecordMapper
.selectByCustomerId(request.getCustomerId());
if (existingCredit != null && "VALID".equals(existingCredit.getStatus())) {
throw new BusinessException("已存在有效授信,无需重复申请");
}
// 4. 调用风控引擎
RiskResult riskResult = riskEngineClient.evaluate(buildRiskRequest(customer));
if (!riskResult.isPassed()) {
CreditRecordDO failedRecord = new CreditRecordDO();
failedRecord.setCustomerId(request.getCustomerId());
failedRecord.setStatus("REJECTED");
failedRecord.setRejectReason(riskResult.getReason());
failedRecord.setCreateTime(new Date());
creditRecordMapper.insert(failedRecord);
return CreditApplyResponse.rejected(riskResult.getReason());
}
// 5. 计算授信额度
BigDecimal creditAmount = calculateCreditAmount(customer, riskResult);
// 6. 保存授信记录
CreditRecordDO record = new CreditRecordDO();
record.setCustomerId(request.getCustomerId());
record.setCreditAmount(creditAmount);
record.setStatus("VALID");
record.setEffectiveDate(new Date());
record.setExpireDate(calculateExpireDate());
record.setCreateTime(new Date());
creditRecordMapper.insert(record);
return CreditApplyResponse.success(creditAmount);
}
private BigDecimal calculateCreditAmount(CustomerDO customer, RiskResult riskResult) {
BigDecimal baseAmount = customer.getAnnualIncome()
.multiply(new BigDecimal("0.5"));
BigDecimal adjustedAmount = baseAmount
.multiply(riskResult.getCreditMultiplier());
return adjustedAmount.min(new BigDecimal("500000"));
}
}
// 数据对象(贫血模型)
@Data
@TableName("t_customer")
public class CustomerDO {
private Long id;
private String name;
private String idCard;
private String phone;
private String status;
private BigDecimal annualIncome;
private String companyName;
private Date createTime;
private Date updateTime;
}
@Data
@TableName("t_credit_record")
public class CreditRecordDO {
private Long id;
private Long customerId;
private BigDecimal creditAmount;
private String status;
private String rejectReason;
private Date effectiveDate;
private Date expireDate;
private Date createTime;
}
微服务拆分实操:用什么原则划边界是系统设计的核心,它决定了系统的可扩展性、可靠性和可维护性。
本文介绍了微服务拆分实操:用什么原则划边界的设计原则和实践经验,帮助你提升架构设计能力。
spring:
application:
name: order-service
cloud:
nacos:
discovery:
server-addr: nacos-cluster:8848
namespace: production
group: ECOMMERCE
config:
server-addr: nacos-cluster:8848
namespace: production
group: ECOMMERCE
file-extension: yaml
shared-configs:
- data-id: common-config.yaml
group: ECOMMERCE
refresh: true
分库分表概念篇是系统设计的核心,它决定了数据的存储方式和访问效率。
本文介绍了分库分表概念篇的原理和最佳实践,帮助你构建高效的数据存储方案。
当硬件达到瓶颈无法提升,通过把数据分散到不同的数据库中,使得单一数据库的数据量变小来缓解单一数据库的性能问题,从而达到提升数据库性能的目的。
比如:将电商数据库拆分为若干独立的数据库,并且对于大表来说也拆分为若干小表,通过这种数据库拆分的方法来解决数据库的性能问题。
分库分表的目的就是为了解决由于数据量过而导致数据库性能降低的问题,将原来独立的数据库拆分为若干数据库组成,将数据大表拆分成若干数据表,使得单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目的。