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

spring AOP学习

概念

  • 面向切面编程
  • 横向扩展
  • 动态代理

相关术语

动态代理

spring在运行期,生成动态代理对象,不需要特殊的编译器

Spring AOP的底层就是通过JDK动态代理或者CGLIb动态代理技术为目标Bean执行横向织入

  1.  目标对象实现了接口,spring使用JDK的java.lang.reflect.Proxy类代理
  2. 若目标对象没有实现任何接口,spring使用CGLib库生成目标对象的子类

AOP通知类型

  • 前置通知
  • 后置通知
  • 环绕通知
  • 异常通知
  • 引介通知

AOP切面类型

  • Advisor:代表一般切面,Advice本身就是一个切面,对目标类所有方法进行拦截
  • PointcutAdvisor:代表具有切点的切面,可以指定拦截目标类哪些方法

AspectJ

实现spring AOP的一个框架

通知类型

@Before 前置通知,相当于BeforeAdvice

@AfterReturning 后置通知,相当于AfterReturningAdvice

@Around 环绕通知,相当于MethodInterceptor

@AfterThrowing异常抛出通知,相当于ThrowAdvice

@After 最终final通知,不管是否异常,该通知都会执行

切入点表达式

 注意:

 代码在 spring-aop中

 

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;@Aspect
public class MyAdvice {/*** 可以获取到方法的返回值* 给update方法进行后置增强*/@AfterReturning(value = "execution(* cn.ting.aop.aspectj.*.update(..))",returning="result")public void after(String result){System.out.println("后置通知"+result);}/**** 给insert方法进行前置增强*/@Before(value = "execution(* cn.ting.aop.aspectj.*.insert(..))")public void before(JoinPoint joinPoint){System.out.println("前置通知"+joinPoint.getTarget());}/*** 环绕通知* @param joinPoint*/@Around(value = "execution(* cn.ting.aop.aspectj.*.find(..))")public Object around(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("前置通知");Object proceed = joinPoint.proceed();System.out.println("后置通知");return proceed;}}

http://www.lryc.cn/news/108786.html

相关文章:

  • 16.M端事件和JS插件
  • Zebec APP:构建全面、广泛的流支付应用体系
  • Spark 3.1.1 遇到的 from_json regexp_replace组合表达式慢问题的解决
  • Docker 容器常用的命令和操作
  • iTOP-RK3568开发板Windows 安装 RKTool 驱动
  • nginx rtmp http_flv直播推流
  • Day50 算法记录| 动态规划 17(子序列)
  • RabbitMQ:概念和安装,简单模式,工作,发布确认,交换机,死信队列,延迟队列,发布确认高级,其它知识,集群
  • 小研究 - 基于解析树的 Java Web 灰盒模糊测试(二)
  • 对于现有的分布式id发号器的思考 id生成器 雪花算法 uuid
  • jmeter中json提取器,获取多个值,并通过beanshell组成数组
  • 通过nvm工具快捷切换node.js版本、以及nvm的安装
  • 企业如何搭建矩阵内容,才能真正实现目的?
  • Arduino驱动MQ5模拟煤气气体传感器(气体传感器篇)
  • Mongodb安装(Centos7)
  • Python 批量处理JSON文件,替换某个值
  • 凯迪正大—SF6泄漏报警装置的主要特点
  • 适配器模式与装饰器模式对比分析:优雅解决软件设计中的复杂性
  • idea使用protobuf
  • 【深度学习_TensorFlow】误差函数
  • mysql按照日期分组统计数据
  • 19 | 分类模型评估指标
  • 【Pycharm2022.2.1】python编辑器最新版安装教程(包含2017-2022的所有版本win/mac/linux)
  • 深度学习-相关概念
  • 眼科医生推荐的台灯 护眼台灯买什么好?
  • 如何使用 ChatGPT 为 Midjourney 或 DALL-E 等 AI 图片生成提示词
  • 【Linux后端服务器开发】Reactor模式实现网络计算器
  • 【WebRTC---源码篇】(二:一)PeerConnection详解
  • 使用tinyxml解析和修改XML文件
  • [Docker实现测试部署CI/CD----相关服务器的安装配置(1)]