当前位置: 首页 > article >正文

1.4 AOP编程范式

1.4 AOP编程范式

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

代理机制对比矩阵

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

JDK动态代理实现原理

// 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;
    }

    @Override
    public 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字节码增强示例

// 1. 定义方法拦截器
public class CacheInterceptor implements MethodInterceptor {
    private final Map<String, Object> cache = new ConcurrentHashMap<>();

    @Override
    public 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 声明式事务控制实战(金融交易案例)

事务配置全流程

// 1. 配置事务管理器
@Configuration
@EnableTransactionManagement
public class TransactionConfig {
    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

// 2. 服务层事务控制
@Service
public class BankTransferService {
    private final JdbcTemplate jdbcTemplate;

    @Autowired
    public 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
        );
    }
}

事务传播机制实验

@Service
public class OrderService {
    @Autowired
    private InventoryService inventoryService;

    @Transactional
    public 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 自定义审计日志实现(电商系统案例)

审计注解定义

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

切面实现细节

@Aspect
@Component
public class AuditAspect {
    private final AuditLogRepository logRepository;
    
    @Autowired
    public 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(", "));
    }
}

业务层使用示例

@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在微服务监控中的创新应用

监控指标采集方案

@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")
    );
}

熔断监控集成

@Aspect
@Component
public class CircuitBreakerAspect {
    private final CircuitBreakerRegistry registry;

    @Autowired
    public 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.kler.cn/a/541015.html

相关文章:

  • Python Pandas(3):DataFrame
  • 深入探究 Rust 测试:灵活控制测试的执行方式
  • RabbitMq入门
  • 【虚幻引擎UE】AOI算法介绍与实现案例
  • 在 Open WebUI+Ollama 上运行 DeepSeek-R1-70B 实现调用
  • 练习题(2025.2.9)
  • 【Matlab优化算法-第15期】基于NSGA-II算法的铁路物流园区功能区布局优化
  • 基于javaweb的SpringBoot电影推荐系统
  • 龙迅LT8711UXD 高性能2PORT TYPE-CDPEDP转HDMi 2.0加PD 3.0,内置MCU
  • 【C++】RBTree(红黑树)模拟实现
  • C#(19) 抽象类和抽象方法,接口
  • 使用 PDF SDK 通过页面分割和数据提取对建筑图纸进行分类
  • MYSQL实现原理 - 事务的隔离级别
  • nginx负载均衡后sse效果出不来,应该怎么排查
  • PAT甲级1053、 Path of Equal Weight
  • 游戏引擎学习第97天
  • 【探索未来科技】2025年国际学术会议前瞻
  • 2025影视泛目录站群程序设计_源码二次开发新版本无缓存刷新不变实现原理
  • 前端基础内容(一)
  • 拉格朗日插值法的matlab实现
  • .net处理dynamic类型运行之后的数据
  • 12.10 LLM 操作能力的边界突破(WebGPT vs SayCan)
  • 数据中心网络架构 — 云网一体化数据中心网络 — 算力网络 — SDN 架构
  • Redis7.0八种数据结构底层原理
  • 区块链100问之加密算法
  • 【机器学习】K-Nearest Neighbor KNN算法原理简介及要点