茉莉花插件:3个核心功能彻底改变你的中文文献管理体验
2026/5/31 20:17:17
好的,我们聚焦于Spring AOP的核心机制与实践要点:
面向切面编程(AOP)通过横向切割代码逻辑,将通用功能(如日志、事务)与核心业务解耦。其核心模型:
@Aspect @Component public class LoggingAspect { // 定义切入点:匹配Service层所有方法 @Pointcut("execution(* com.example.service.*.*(..))") public void serviceLayer() {} // 前置通知 @Before("serviceLayer()") public void logMethodCall(JoinPoint jp) { String methodName = jp.getSignature().getName(); System.out.println("调用方法: " + methodName); } // 环绕通知(控制执行流程) @Around("serviceLayer()") public Object monitorPerformance(ProceedingJoinPoint pjp) throws Throwable { long start = System.currentTimeMillis(); Object result = pjp.proceed(); // 执行原方法 long duration = System.currentTimeMillis() - start; System.out.println("方法执行耗时: " + duration + "ms"); return result; } }execution(修饰符? 返回类型 包路径.类名.方法名(参数列表) 异常?)*匹配任意字符(不跨越包边界)..匹配任意子包或任意数量参数execution(* com.example..*.*(..))→ 匹配com.example包及其子包所有方法@annotation(org.springframework.transaction.annotation.Transactional)→ 匹配带@Transactional注解的方法Spring AOP默认使用动态代理:
代理选择优先级:
graph LR A[目标类实现接口?] -->|是| B[JDK动态代理] A -->|否| C[CGLIB代理]// 声明式事务管理 @Transactional @Retryable(maxAttempts=3) // 自定义重试切面 public void transferMoney(Account src, Account dest, double amount) { src.debit(amount); dest.credit(amount); }优势:
..通配符@Around→ 细粒度控制@Before/@After→ 轻量级拦截<aop:aspectj-autoproxy proxy-target-class="true"/> <!-- 强制CGLIB -->通过合理运用切面,可将系统级关注点(如安全、监控)集中管理,显著提升代码可维护性与架构清晰度。