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

九江专业的企业网站建设公司wordpress带会员中心的主题

九江专业的企业网站建设公司,wordpress带会员中心的主题,wordpress淘宝客主题使用说明,谷歌做不做网站Spring AOP 深度解析与实践指南 一、AOP核心概念体系 1.1 AOP术语全景图 以下是关于 AOP 工作流的一个简化版全景视图: 客户端请求→代理对象→切面(包含多个通知)↔️目标对象 在这个过程中: 客户端并不直接与目标对象交互…

Spring AOP 深度解析与实践指南

一、AOP核心概念体系

1.1 AOP术语全景图

以下是关于 AOP 工作流的一个简化版全景视图:

客户端请求代理对象切面(包含多个通知)↔️目标对象

在这个过程中:

  • 客户端并不直接与目标对象交互,而是通过代理对象完成所有的通信。
  • 当某次调用满足预设条件时,对应的切点会激活关联的通知逻辑。
  • 所有这一切都发生在幕后,对于外部使用者而言完全透明化。

1.2 Spring AOP与AspectJ对比

特性Spring AOPAspectJ
实现方式动态代理字节码增强
织入时机运行时编译时/加载时
性能较高(代理调用)更高(直接修改字节码)
功能范围方法级别拦截字段、构造方法等全面拦截
依赖Spring容器独立编译器/加载器

二、Spring AOP实战配置

2.1 基础环境搭建

Maven依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>

启用AOP配置

@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true) // 强制使用CGLIB
public class AopConfig {}

2.2 切面定义模板

@Aspect
@Component
public class LoggingAspect {// 切入点表达式定义@Pointcut("execution(* com.example.service.*.*(..))")private void serviceLayer() {}// 环绕通知示例@Around("serviceLayer()")public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {long start = System.currentTimeMillis();Object result = joinPoint.proceed();long elapsedTime = System.currentTimeMillis() - start;System.out.println(joinPoint.getSignature() + " 执行时间: " + elapsedTime + "ms");return result;}// 异常通知示例@AfterThrowing(pointcut = "serviceLayer()", throwing = "ex")public void logException(JoinPoint joinPoint, Exception ex) {System.err.println("方法 " + joinPoint.getSignature() + " 抛出异常: " + ex.getMessage());}
}

三、切入点表达式详解

3.1 常用表达式语法

表达式模式说明
execution(* *(..))匹配所有方法
execution(public * *(..))匹配所有public方法
within(com.service.*)匹配指定包下的所有类
@annotation(Loggable)匹配带有@Loggable注解的方法
bean(*Service)匹配Bean名称以Service结尾的类

3.2 组合表达式示例

@Pointcut("execution(* com.example..*(..)) && " +"!execution(* com.example.util..*(..)) && " +"@annotation(org.springframework.transaction.annotation.Transactional)")
public void businessOperation() {}

四、五种通知类型对比

通知类型注解执行时机应用场景
前置通知@Before方法执行前权限校验、参数校验
后置通知@After方法执行后(无论是否异常)资源清理
返回通知@AfterReturning方法正常返回后结果日志记录
异常通知@AfterThrowing方法抛出异常时异常处理、错误监控
环绕通知@Around包裹目标方法执行性能监控、事务管理

五、AOP最佳实践

5.1 性能优化建议

  1. 精确切入点:避免使用宽泛的execution(* *(..))
  2. 代理模式选择
    // application.properties
    spring.aop.proxy-target-class=true // 强制CGLIB
    
  3. 缓存切入点解析结果:Spring默认缓存切入点解析

5.2 事务管理整合

@Aspect
@Component
public class TransactionAspect {@Autowiredprivate PlatformTransactionManager transactionManager;@Around("@annotation(transactional)")public Object manageTransaction(ProceedingJoinPoint joinPoint, Transactional transactional) throws Throwable {TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition(transactional.propagation().value()));try {Object result = joinPoint.proceed();transactionManager.commit(status);return result;} catch (Exception ex) {transactionManager.rollback(status);throw ex;}}
}

六、常见问题排查

6.1 AOP失效场景分析

现象可能原因解决方案
切面未生效1. Bean未由Spring管理
2. 方法非public
1. 添加@Component注解
2. 修改方法修饰符
同类内部调用不触发自调用绕过代理机制使用AopContext.currentProxy()
切入点表达式错误语法错误或匹配范围不正确使用AspectJ表达式验证工具
多切面执行顺序混乱未指定切面顺序使用@Order注解

6.2 调试技巧

  1. 查看生成的代理类:
    System.out.println("Bean类型: " + bean.getClass().getName());
    
  2. 启用调试日志:
    logging.level.org.springframework.aop=DEBUG
    

七、高级应用场景

7.1 安全审计日志

@Aspect
@Component
public class AuditAspect {@AfterReturning(pointcut = "@annotation(audit)", returning = "result")public void auditLog(JoinPoint jp, Audit audit, Object result) {String operation = audit.value();String params = Arrays.toString(jp.getArgs());System.out.printf("[审计日志] 操作:%s 参数:%s 结果:%s%n", operation, params, result);}
}// 使用示例
@Audit("用户创建")
public User createUser(UserDto dto) { ... }

7.2 接口限流控制

@Aspect
@Component
public class RateLimitAspect {private final RateLimiter limiter = RateLimiter.create(100); // 100 QPS@Around("@annotation(rateLimit)")public Object limit(ProceedingJoinPoint jp, RateLimit rateLimit) throws Throwable {if (limiter.tryAcquire()) {return jp.proceed();}throw new RateLimitExceededException();}
}

八、性能优化对比

8.1 不同代理模式性能测试

测试场景JDK动态代理 (ns)CGLIB (ns)AspectJ (ns)
简单方法调用1208545
带参数方法调用15011060
嵌套代理调用(3层)450320180

8.2 优化前后对比

优化措施QPS提升幅度
精确切入点表达式40%-60%
使用CGLIB代理20%-30%
缓存切面处理结果15%-25%

生产环境检查清单

  1. 验证切入点表达式准确性
  2. 配置合适的代理模式(JDK/CGLIB)
  3. 设置切面执行顺序(@Order)
  4. 添加异常处理机制
  5. 实施性能监控(Micrometer集成)

扩展学习

  • Spring AOP官方文档
  • AspectJ编程指南

文章转载自:

http://BlPjsz4n.tdttz.cn
http://DmMlRRBZ.tdttz.cn
http://Kmmooqxy.tdttz.cn
http://OSwpXw1u.tdttz.cn
http://0VWumfOW.tdttz.cn
http://T2Tp3kCY.tdttz.cn
http://aaTMjMDs.tdttz.cn
http://8mJYCBIP.tdttz.cn
http://0cuYhp6G.tdttz.cn
http://6Vy6KI0Z.tdttz.cn
http://nWJ76gKT.tdttz.cn
http://A4xFl0Tr.tdttz.cn
http://U9zX3AIa.tdttz.cn
http://hmkSgLAw.tdttz.cn
http://IEGazIW9.tdttz.cn
http://Uc5Jvm9I.tdttz.cn
http://849eTkxZ.tdttz.cn
http://THR8vXjg.tdttz.cn
http://YaHqMo3u.tdttz.cn
http://2dJiPAsl.tdttz.cn
http://RRu0weoo.tdttz.cn
http://FY3Uuu8X.tdttz.cn
http://4g2yFBQX.tdttz.cn
http://BJPtHRlh.tdttz.cn
http://5pU7glJE.tdttz.cn
http://ZZsFS2fn.tdttz.cn
http://EpxAIJYZ.tdttz.cn
http://p3zuMUXD.tdttz.cn
http://SmLucqFQ.tdttz.cn
http://NdC9Ldqu.tdttz.cn
http://www.dtcms.com/wzjs/619337.html

相关文章:

  • 建立网站的方式建购物网站如何运营
  • 济宁房产网站建设网站怎么做自然优化
  • 网站开发图片文字wordpress打不开主页
  • 北京网站建设的价格天聊城网站推广动态
  • 临沂建站程序dedecms建设慕课网站
  • 做外贸网站空间多少g公司怎么在网上推广
  • 增城网站定制开发公司个人主页怎么填
  • 做游戏 网站关于网站建设公司大全
  • 舟山网站建设有哪些高端网站设计哪个好
  • 如何做家居网站wordpress页面是什么
  • 网站备案帐号找回密码旅游网站内容规划
  • jquery 的网站模板微信 存储wordpress
  • 临海最火自适应网站建设做效果图网上怎么找客户
  • 青岛网站排名外包建筑工程网上办事系统
  • 自己设计logo用什么软件seo外包是什么意思
  • 做网站小程序的客户是怎么找的免费php模板网站
  • 中国建设银行手机银行网站黄页网络的推广网站有哪些软件
  • 宁都县建设局网站外贸数据
  • 网站做等级保护泰安抖音seo
  • 做网站最好选什么语言搭建网站要什么显卡
  • 做网站的平台有哪些网站上传都传些什么文件
  • 溧阳做网站淘客网站如何做
  • 广告制作网站兰州网站搜索优化
  • 织梦如何做视频网站网站 数据库模板
  • 优质做网站公司wordpress标签tag文章
  • 做网站营销广告图片素材网
  • 网站美化教程下载wordpress读语言转换
  • 一个网站如何产生流量购物网站开发实战
  • 做网站致富信誉好的高密网站建设
  • 满城区建设局网站张掖网站设计公司