1.4 AOP编程范式

devtools/2025/2/11 15:45:12/

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/devtools/157967.html

相关文章

Python:基础语法

一、常量和表达式 我们可以把 Python 当成一个计算器, 来进行一些算术运算. 可以使用 - * / ( ) 等运算符进行算术运算. 先算乘除, 后算加减. 运算符和数字之间, 可以没有空格, 也可以有多个空格. 但是一般习惯上写一个空格(比较美观). print(1 2 - 3)print(1 2 * 3)pri…

25/2/8 <机器人基础> 阻抗控制

1. 什么是阻抗控制&#xff1f; 阻抗控制旨在通过调节机器人与环境的相互作用&#xff0c;控制其动态行为。阻抗可以理解为一个力和位移之间的关系&#xff0c;涉及力、速度和位置的协同控制。 2. 阻抗控制的基本概念 力控制&#xff1a;根据感测的外力调节机械手的动作。位置…

【图像去噪】论文精读:Masked and Shuffled Blind Spot Denoising for Real-World Images(MASH)

请先看【专栏介绍文章】:【图像去噪(Image Denoising)】关于【图像去噪】专栏的相关说明,包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、去噪概述、文章目录、资料汇总、问题汇总(更新中) 文章目录 前言Abstract1. Introduction2. Related…

Docker 一文学会快速搭建ollama环境及运行deepseek-r1

Docker 一文学会快速搭建ollama环境及运行deepseek-r1 文章目录 前言正文配置ollama环境拉取镜像启动容器 配置deepseek 总结 前言 近年来&#xff0c;人工智能技术飞速发展&#xff0c;大模型作为其中的重要分支&#xff0c;正在深刻改变各行各业的工作方式和效率。Deepseek …

Python Pandas(7):Pandas 数据清洗

数据清洗是对一些没有用的数据进行处理的过程。很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况&#xff0c;如果要使数据分析更加准确&#xff0c;就需要对这些没有用的数据进行处理。数据清洗与预处理的常见步骤&#xff1a; 缺失值处理&#xff1a;识别并…

游戏引擎学习第93天

回顾并推动进展 我们上一期的进展是&#xff0c;我们第一次开始填充可以任意旋转和缩放的固体形状。接下来我们希望继续推进图形功能&#xff0c;能够支持更多的特性&#xff0c;以便拥有一个真正的渲染器。 目前的目标是开始填充这些形状&#xff0c;并能够支持旋转、缩放&a…

vue学习6

1. 智慧商城 1. 路由设计配置 单个页面&#xff0c;独立展示的&#xff0c;是一级路由 2.二级路由配置 规则&组件配置导航链接配置路由出口 <template><div id"app"><!--二级路由出口--><router-view></router-view><van-…

Transformer

1 认识Transformer 定义:Transformer是基于Seq2Seq架构的模型,可以完成NLP领域研究的典型任务,如机器翻译,文本生成等,同时又可以构建预训练语言模型,用于不同任务的迁移学习。 //本篇主要介绍通过transformer架构实现从一种语言文本到另一种语言文本的翻译工作。使用NL…