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

面向切面编程

Spring AOP简介

AOP把业务功能分为核心、非核心两部分。

  • 核心业务功能:用户登录、增加数据、删除数据。
  • 非核心业务功能:性能统计、日志、事务管理。
    在Spring的面向切面编程(AOP)思想里,非核心业务功能被定义为切面。核心业务功能和切面功能先被分别进行独立开发,然后把切面功能和核心业务功能“编织”在一起,这就是AOP。
  • 切入点(pointcut):在哪些类、哪些方法上切入。
  • 通知(advice):在方法钱、方法后、方法前后做什么。
  • 切面(aspect):切面=切入点+通知。即在什么时机、什么地方、做什么。
  • 织入(weaving):把切面加入对象,并创建出代理对象的过程。
  • 环绕通知:AOP中最强大、灵活的通知,它集成了前置和后置通知,保留了连接点原有的方法。

实例演示

  1. 定义切点
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?)
  • 修饰符匹配(modifier-pattern?)
  • 返回值匹配(ret-type-pattern)可以为*表示任何返回值,全路径的类名等
  • 类路径匹配(declaring-type-pattern?)
  • 方法名匹配(name-pattern)可以指定方法名 或者 代表所有, set 代表以set开头的所有方法
  • 参数匹配((param-pattern))可以指定具体的参数类型,多个参数间用“,”隔开,各个参数也可以用“”来表示匹配任意类型的参数,如(String)表示匹配一个String参数的方法;(,String) 表示匹配有两个参数的方法,第一个参数可以是任意类型,而第二个参数是String类型;可以用(…)表示零个或多个任意参数
  • 异常类型匹配(throws-pattern?)
  • 其中后面跟着“?”的是可选项
@Pointcut("execution(public * com.gd..*.*(..))")
    public void aopWebLog() {

    }
@Before("aopWebLog()")
    public void doBefore(JoinPoint joinPoint) throws Throwable{
        startTime.set(System.currentTimeMillis());
        //  接收到请求,记录请求内容
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        //  记录下请求内容
        log.info("URL:" + request.getRequestURL().toString());
        log.info("HTTP方法:" + request.getMethod());
        log.info("IP:" + request.getRemoteAddr());
        log.info("类的方法:" + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
        log.info("参数:" + request.getQueryString());
    }

    @AfterReturning(pointcut = "aopWebLog()", returning = "retObject")
    public void doAfterReturning(Object retObject) throws Throwable{
        //  处理完请求,返回内容
        log.info("应答值:" + retObject);
        log.info("费时:" + (System.currentTimeMillis() - startTime.get()) + "ms");
    }

    @AfterThrowing(pointcut = "aopWebLog()", throwing = "ex")
    public void addAfterThrowingLogger(JoinPoint joinPoint, Exception ex) {
        log.error("执行异常,{}", ex);
    }

代码解释:

  • @Before:在切入点开始处切入内容。
  • @After:在切入点结尾处切入内容。
  • @AfterReturning:在切入点返回(return)内容之后切入内容,可以用来对处理返回值做一些加工处理。
  • @Around:在切入点前后切入内容,并控制何时执行切入点自身的内容。
  • @AfterThrowing:用来处理当切入内容部分抛出异常之后的处理逻辑。
  • @Aspect:标记为切面类。
  • @Component:把切面类加入IoC容器中,让Spring进行管理。

运行结果

运行结果

相关文章:

  • 【Linux】shell 及权限理解
  • 交换类排序
  • Git学习笔记-1.Git基础知识
  • 无线传感网络的自适应协作数据传输方法
  • 统计学习方法 李航 课后习题答案 第二版 机器学习
  • 分布式光伏运维平台具体有哪些功能?
  • 登录拦截器、过滤器中注入bean 操作Redis,RedisTemplate为unll问题
  • 【MybatisPlus】最全面的MybatisPlus通关教程
  • 2022 软件测试填空判断题【太原理工大学】
  • 万字长文,彻底搞懂分布式缓存Redis
  • Android -- 每日一问:如何检测内存泄露,如何进行内存优化?
  • 10_缓存-2_二级缓存
  • 【FAQ】申请Health Kit权限的常见问题及解答
  • Servlet生命周期和线程安全
  • 【C++进阶】C++11新特性下篇(万字详解)
  • [ JavaScript ] 数据结构与算法 —— 链表
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Angular数据绑定机制
  • ES6 ...操作符
  • Gradle 5.0 正式版发布
  • Iterator 和 for...of 循环
  • Lucene解析 - 基本概念
  • MySQL用户中的%到底包不包括localhost?
  • nodejs实现webservice问题总结
  • PAT A1120
  • PHP的Ev教程三(Periodic watcher)
  • rc-form之最单纯情况
  • 设计模式(12)迭代器模式(讲解+应用)
  • 深度学习中的信息论知识详解
  • 试着探索高并发下的系统架构面貌
  • 王永庆:技术创新改变教育未来
  • No resource identifier found for attribute,RxJava之zip操作符
  • AI算硅基生命吗,为什么?
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • #微信小程序(布局、渲染层基础知识)
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (推荐)叮当——中文语音对话机器人
  • (五)IO流之ByteArrayInput/OutputStream
  • .NET 反射的使用
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET框架
  • .Net下的签名与混淆
  • /proc/stat文件详解(翻译)
  • @Autowired 与@Resource的区别
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [ANT] 项目中应用ANT
  • [BZOJ] 1001: [BeiJing2006]狼抓兔子
  • [BZOJ4554][TJOI2016HEOI2016]游戏(匈牙利)
  • [C#][DevPress]事件委托的使用
  • [Go WebSocket] 多房间的聊天室(三)自动清理无人房间
  • [Java][Android][Process] 暴力的服务能够解决一切,暴力的方式运行命令行语句
  • [LeetCode系列]子集枚举问题[无重复元素]
  • [linux] shell中的()和{}
  • [oeasy]python0002_终端_CLI_GUI_编程环境_游戏_真实_元宇宙