1.4 AOP编程范式

server/2025/2/12 11:30:55/

1.4 AOP编程范式

1.4.1 代理模式底层原理剖析(字节码级解析)

代理机制对比矩阵

| 维度           | JDK动态代理                     | CGLIB字节码增强               |
|----------------|--------------------------------|------------------------------|
| 代理对象类型    | 接口代理                       | 类代理(final类除外)          |
| 性能开销       | 反射调用(约300ns/次)         | 直接方法调用(约50ns/次)       |
| 依赖限制       | 需实现接口                     | 无特殊要求                    |
| 生成方式       | Proxy.newProxyInstance         | Enhancer.create               |
| 方法拦截       | InvocationHandler              | MethodInterceptor             |
| 适用场景       | 轻量级代理/接口明确场景         | 需要继承/性能敏感场景           |

JDK动态代理实现原理

java">// 1. 定义业务接口
public interface UserService {void createUser(String name);
}// 2. 实现InvocationHandler
public class AuditHandler implements InvocationHandler {private final Object target;public AuditHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) {long start = System.nanoTime();Object result = method.invoke(target, args);System.out.printf("方法 %s 执行耗时 %dns%n", method.getName(), System.nanoTime()-start);return result;}
}// 3. 生成代理对象
UserService proxyInstance = (UserService) Proxy.newProxyInstance(UserService.class.getClassLoader(),new Class[]{UserService.class},new AuditHandler(new UserServiceImpl())
);

CGLIB字节码增强示例

java">// 1. 定义方法拦截器
public class CacheInterceptor implements MethodInterceptor {private final Map<String, Object> cache = new ConcurrentHashMap<>();@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) {String key = method.getName() + Arrays.toString(args);return cache.computeIfAbsent(key, k -> {try {return proxy.invokeSuper(obj, args);} catch (Throwable e) {throw new RuntimeException(e);}});}
}// 2. 生成增强类
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(ProductService.class);
enhancer.setCallback(new CacheInterceptor());
ProductService cachedService = (ProductService) enhancer.create();

1.4.2 声明式事务控制实战(金融交易案例)

事务配置全流程

java">// 1. 配置事务管理器
@Configuration
@EnableTransactionManagement
public class TransactionConfig {@Beanpublic PlatformTransactionManager transactionManager(DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}
}// 2. 服务层事务控制
@Service
public class BankTransferService {private final JdbcTemplate jdbcTemplate;@Autowiredpublic BankTransferService(DataSource dataSource) {this.jdbcTemplate = new JdbcTemplate(dataSource);}@Transactional(isolation = Isolation.REPEATABLE_READ,propagation = Propagation.REQUIRED,rollbackFor = {BalanceInsufficientException.class})public void transfer(String from, String to, BigDecimal amount) {// 扣款操作jdbcTemplate.update("UPDATE account SET balance = balance - ? WHERE id = ?",amount, from);// 模拟业务异常if (amount.compareTo(BigDecimal.valueOf(10000)) > 0) {throw new FraudDetectionException("大额交易需人工审核");}// 入账操作jdbcTemplate.update("UPDATE account SET balance = balance + ? WHERE id = ?",amount, to);}
}

事务传播机制实验

java">@Service
public class OrderService {@Autowiredprivate InventoryService inventoryService;@Transactionalpublic void createOrder(Order order) {// 主事务方法saveOrder(order);try {inventoryService.deductStock(order.getItems());} catch (Exception e) {// 独立事务中的异常不会导致主事务回滚log.error("库存扣减失败", e);}}
}@Service
public class InventoryService {@Transactional(propagation = Propagation.REQUIRES_NEW)public void deductStock(List<OrderItem> items) {items.forEach(item -> {jdbcTemplate.update("UPDATE product SET stock = stock - ? WHERE id = ?",item.getQuantity(), item.getProductId());});}
}

1.4.3 自定义审计日志实现(电商系统案例)

审计注解定义

java">@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AuditLog {String module() default "";OperationType type();enum OperationType {CREATE, UPDATE, DELETE, QUERY}
}

切面实现细节

java">@Aspect
@Component
public class AuditAspect {private final AuditLogRepository logRepository;@Autowiredpublic AuditAspect(AuditLogRepository logRepository) {this.logRepository = logRepository;}@Around("@annotation(auditLog)")public Object logOperation(ProceedingJoinPoint pjp, AuditLog auditLog) throws Throwable {MethodSignature signature = (MethodSignature) pjp.getSignature();String methodName = signature.getName();Object[] args = pjp.getArgs();AuditLogEntity log = new AuditLogEntity();log.setModule(auditLog.module());log.setOperationType(auditLog.type().name());log.setMethod(methodName);log.setParameters(serializeArguments(args));log.setOperator(getCurrentUser());long start = System.currentTimeMillis();try {Object result = pjp.proceed();log.setSuccess(true);log.setResult(serializeResult(result));return result;} catch (Exception e) {log.setSuccess(false);log.setErrorMsg(e.getMessage());throw e;} finally {log.setDuration(System.currentTimeMillis() - start);logRepository.save(log);}}private String serializeArguments(Object[] args) {return Arrays.stream(args).map(arg -> {if (arg instanceof MultipartFile) {return ((MultipartFile) arg).getOriginalFilename();}return arg.toString();}).collect(Collectors.joining(", "));}
}

业务层使用示例

java">@Service
public class ProductService {@AuditLog(module = "商品管理", type = AuditLog.OperationType.CREATE)public Product createProduct(Product product) {// 创建商品逻辑}@AuditLog(module = "商品管理", type = AuditLog.OperationType.UPDATE)public Product updateProduct(Long id, Product product) {// 更新商品逻辑}
}

1.4.4 AOP在微服务监控中的创新应用

监控指标采集方案

java">@Aspect
@Component
@RequiredArgsConstructor
public class MetricsAspect {private final MeterRegistry meterRegistry;@Around("execution(* com.example..*Controller.*(..))")public Object collectMetrics(ProceedingJoinPoint pjp) throws Throwable {String className = pjp.getTarget().getClass().getSimpleName();String methodName = pjp.getSignature().getName();Timer.Sample sample = Timer.start(meterRegistry);try {Object result = pjp.proceed();sample.stop(Timer.builder("http_requests").tags("class", className, "method", methodName, "status", "200").register(meterRegistry));return result;} catch (Exception e) {sample.stop(Timer.builder("http_requests").tags("class", className, "method", methodName, "status", "500").register(meterRegistry));throw e;}}
}// Prometheus配置示例
@Bean
public MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {return registry -> registry.config().commonTags("application", "order-service","environment", System.getenv("APP_ENV"));
}

熔断监控集成

java">@Aspect
@Component
public class CircuitBreakerAspect {private final CircuitBreakerRegistry registry;@Autowiredpublic CircuitBreakerAspect(CircuitBreakerRegistry registry) {this.registry = registry;}@Around("@annotation(cbAnnotation)")public Object protect(ProceedingJoinPoint pjp, CircuitBreakerDef cbAnnotation) throws Throwable {CircuitBreaker breaker = registry.circuitBreaker(cbAnnotation.name());return breaker.executeSupplier(() -> {try {return pjp.proceed();} catch (Throwable e) {throw new RuntimeException(e);}});}
}// 业务方法使用示例
@Service
public class PaymentService {@CircuitBreakerDef(name = "paymentService", failureRateThreshold = 50,waitDurationInOpenState = 10000)public PaymentResult processPayment(PaymentRequest request) {// 支付处理逻辑}
}

http://www.ppmy.cn/server/167044.html

相关文章

SAP-SD信用管理实施总结

SAP-SD 信用管理实施总结 摘要 信用管理是SAP-ERP系统&#xff08;以下简称SAP&#xff09; SD模块中的子模块&#xff0c;主要用于有效平衡赊销模式和资金回笼这两个业务层面之间的矛盾。本文档以信用管理在SAP系统中的实现方法为出发点&#xff0c;结合业务背景&#xff0c;以…

C语言简单练习题

文章目录 练习题一、计算n的阶乘bool类型 二、计算1!2!3!...10!三、计算数组arr中的元素个数二分法查找 四、动态打印字符Sleep()ms延时函数system("cls")清屏函数 五、模拟用户登录strcmp()函数 六、猜数字小游戏产生一个随机数randsrandRAND_MAX时间戳time() 示例 …

Deepseek使用途径以及Prompt 提示词编写原理

Deepseek使用途径以及Prompt 提示词编写原理 1.Deepseek使⽤途径 1.官⽹及APP ⽹址&#xff1a; deepseek.com 及移动应⽤&#xff08;iOS/Android&#xff09; 特征&#xff1a;完整版R1模型&#xff0c;⽀持深度搜索&#xff0c;但⽬前因流量⼤常遇到服务器繁忙问题。 2.…

PCM与G711A互转

PCM与G711A互转 工具类&#xff08;Java&#xff09;调用方法&#xff08;Kotlin&#xff09; 工具类&#xff08;Java&#xff09; public class G711Code {private final static int SIGN_BIT 0x80;private final static int QUANT_MASK 0xf;private final static int SEG…

ZooKeeper 的典型应用场景:从概念到实践

引言 在分布式系统的生态中&#xff0c;ZooKeeper 作为一个协调服务框架&#xff0c;扮演着至关重要的角色。它的设计目的是提供一个简单高效的解决方案来处理分布式系统中常见的协调问题。本文将详细探讨 ZooKeeper 的典型应用场景&#xff0c;包括但不限于配置管理、命名服务…

机器学习数学公式推导笔记

正定方程是凸函数证明 范数 向量的范数与内积 范数例子

Spring Boot 3.4 中 MockMvcTester 的新特性解析

引言 在 Spring Boot 3.4 版本中&#xff0c;引入了一个全新的 MockMvcTester 类&#xff0c;使 MockMvc 测试可以直接支持 AssertJ 断言。本文将深入探讨这一新特性&#xff0c;分析它如何优化 MockMvc 测试并提升测试的可读性。 Spring MVC 示例 为了演示 MockMvcTester 的…

【含文档+PPT+源码】基于python爬虫的豆瓣电影、音乐、图书数据分析系统

项目介绍 本课程演示的是一款基于python爬虫的豆瓣电影、音乐、图书数据分析系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Python学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行…