常用的编程范式

AOP 是什么

  • 是一种编程方式,不是编程语言
  • 解决特定问题,不能解决所有的问题
  • OOP的补充,不是代替

AOP 初衷

  • DRY: Don't repeat yourself(代码重复)
  • SoC:Separation of Concerns(关注点分离)
    • 水平分离:展示层-> 服务层 -> 持久层
    • 垂直分离:模块划分(订单、库存等)
    • 切面分离:分离功能性需求与非功能性需求

AOP的优点

  • 集中处理某一关注点/横切逻辑
  • 可以很方便地添加/删除关注点
  • 侵入性少,增强代码可读性及可维护性

AOP的应用场景

  • 权限控制
  • 缓存控制
  • 性能监控
  • ...

支持AOP的语言

  • Java、Python、PHP...

SpringAOP使用详解

首先,我整理了一张图,让大家更好的梳理SpringAOP的使用

@Poincut 详解

匹配包/类型_ within()
  • 匹配ProductService类里头的所有方法

  • @Pointcut("within(com.zhb.service.ProductService)")

  • 匹配com.zhb包及子包下所有类的方法

  • @Pointcut("within(com.zhb..*)")

匹配对象
  • 匹配AOP对象的目标对象为指定类型的方法,即LogService的aop代理对象的方法

  • @Pointcut("this(com.zhb.log.Loggable)")

  • 匹配实现Loggable接口的目标对象(而不是aop代理后的对象)的方法

  • @Pointcut("target(com.zhb.log.Loggable)")

  • this 可以拦截 DeclareParents(Introduction)

  • target 不拦截 DeclareParents(Introduction)

  • 匹配所有以Service结尾的bean里头的方法

  • @Pointcut("bean(*Service)")

匹配参数 args()
  • 匹配任何以find开头而且只有一个Long参数的方法

  • @Pointcut("execution(* ..find(Long))")

  • 匹配任何以find开头的而且第一个参数为Long型的方法

  • @Pointcut("execution(* ..find(Long,..))")

  • 匹配任何只有一个Long参数的方法

  • @Pointcut("within(com.zhb..*) && args(Long)")

  • 匹配第一个参数为Long型的方法

  • @Pointcut("within(com.zhb..*) && args(Long,..)")

匹配注解
  • 匹配方法标注有AdminOnly的注解的方法
  • @Pointcut("@annotation(com.zhb.anno.AdminOnly) && within(com.zhb..*)")
  • 匹配标注有NeedSecured的类底下的方法 //class级别
  • @Pointcut("@within(com.zhb.anno.NeedSecured) && within(com.zhb..*)")
  • 匹配标注有NeedSecured的类及其子类的方法 //runtime级别
  • 在spring context的环境下,二者没有区别
  • @Pointcut("@target(com.zhb.anno.NeedSecured) && within(com.zhb..*)")
  • 匹配传入的参数类标注有Repository注解的方法
  • @Pointcut("@args(com.zhb.anno.NeedSecured) && within(com.zhb..*)")
匹配方法
  • 匹配任何公共方法

  • @Pointcut("execution(public * com.zhb.service..(..))")

  • 匹配com.zhb包及子包下Service类中无参方法

  • @Pointcut("execution(* com.zhb..Service.())")

  • 匹配com.zhb包及子包下Service类中的任何只有一个参数的方法

  • @Pointcut("execution(* com.zhb..Service.(*))")

  • 匹配com.zhb包及子包下任何类的任何方法

  • @Pointcut("execution(* com.zhb...(..))")

  • 匹配com.zhb包及子包下返回值为String的任何方法

  • @Pointcut("execution(String com.zhb...(..))")

  • 匹配异常

  • execution(public * com.zhb.service..(..) throws java.lang.IllegalAccessException)

其实,这么多实际工作中用到的比较少,我平时就用过execution 这一个。

Advice 详解

  • @Before(value = "matchLongArg() && args(productId)")
  • public void beforeWithArgs(Long productId)
  • @AfterReturning(value = "matchReturn()",returning = "returnValue")
  • public void getReulst(Object returnValue)

给出一段常用代码


@Pointcut("within(com.zhb.controller.GirlController)")
public void mathType(){} @Before(value = "mathType() && args(obj)")
public void before(Object obj){ System.out.println("这里是目标方法执行前先执行");
//获取参数
System.out.println("这里是目标方法的参数"+obj.toString());
}
@AfterReturning(returning = "entity",value = "mathType()")
public void after(JoinPoint joinPoint,Object entity){
System.out.println("这里是目标方法执行完并成功返回结果 正常结束后才执行");
System.out.println("方法的返回结果为"+entity);
System.out.println("目标方法内的参数为"+ Arrays.asList(joinPoint.getArgs()));
}
@AfterThrowing(throwing = "e",value = "mathType()")
public void mathThrow(Throwable e){
System.out.println("这里是目标方法抛出异常后才执行");
System.out.println("异常信息为"+e);
}

大家再用到的时候可以自行搜索

探秘SpringAop(一)_介绍以及使用详解的更多相关文章

  1. 迅为4412开发板Linux驱动教程——总线_设备_驱动注册流程详解

    本文转自:http://www.topeetboard.com 视频下载地址: 驱动注册:http://pan.baidu.com/s/1i34HcDB 设备注册:http://pan.baidu.c ...

  2. SQL Server 表的管理_关于完整性约束的详解(案例代码)

    SQL Server 表的管理之_关于完整性约束的详解 一.概述: ●约束是SQL Server提供的自动保持数据库完整性的一种方法, 它通过限制字段中数据.记录中数据和表之间的数据来保证数据的完整性 ...

  3. Nginx的介绍和安装详解

    [介绍+安装]Nginx的介绍和安装详解   == 介绍和安装 == Nginx是一个自由.开源.高性能及轻量级的HTTP服务器及反转代理服务器, 其性能与IMAP/POP3代理服务器相当.Nginx ...

  4. rsync的介绍及参数详解,配置步骤,工作模式介绍

    rsync的介绍及参数详解,配置步骤,工作模式介绍 rsync是类unix系统下的数据镜像备份工具.它是快速增量备份.全量备份工具. Sync可以远程同步,支持本地复制,或者与其他SSH.rsync主 ...

  5. 2020你还不会Java8新特性?方法引用详解及Stream 流介绍和操作方式详解(三)

    方法引用详解 方法引用: method reference 方法引用实际上是Lambda表达式的一种语法糖 我们可以将方法引用看作是一个「函数指针」,function pointer 方法引用共分为4 ...

  6. UML简单介绍—类图详解

    类图详解 阅读本文前请先阅读:UML简单介绍—类图这么看就懂了 1.泛化关系 一个动物类: /** * 动物类 */ public class Animal { public String name; ...

  7. Underscore _.template 方法使用详解

    为什么用「void 0」代替「undefined」 undefined 并不是保留词(reserved word),它只是全局对象的一个属性,在低版本 IE 中能被重写. 事实上,undefined ...

  8. Python基本语法_输入/输出语句详解

    目录 目录 前言 输入 raw_input input raw_input 和 input 的区别 输出 print print 基本格式化输出 print复杂格式化输出 flags标志位 width ...

  9. 黑马程序员_ Objective-c 面向对象笔记详解

    1)类,对象,方法 类 类名: 1) 类名的第一个字母必须是大写 2) 不能有下划线 3) 多个英文单词,用驼峰标识 类的声明和实现 类的声明 @interface 类名 : NSObject { @ ...

随机推荐

  1. $watch, $watchCollection, $watchGroup的使用

    官方文档 $watch简单使用 $watch是一个scope函数,用于监听模型变化,当你的模型部分发生变化时它会通知你. $watch(watchExpression, listener, objec ...

  2. 监听Google Player下载并获取包名等信息

    一.解决思路 通过监听ContentObserver监听下载路径content://downloads 二.具体步骤 1 设置监听器 context.getContentResolver() .reg ...

  3. 手把手教你测微信小程序

    WeTest 导读 在小程序持续大量爆发的形势下,现在已经成为了各平台竞争的战略布局重点.至今年2月,月活超500万的微信小程序已经达到237个,其中个人开发占比高达2成.因小程序的开发门槛低.传播快 ...

  4. 大数据中Hadoop集群搭建与配置

    前提环境是之前搭建的4台Linux虚拟机,详情参见 Linux集群搭建 该环境对应4台服务器,192.168.1.60.61.62.63,其中60为主机,其余为从机 软件版本选择: Java:JDK1 ...

  5. 通过切换iframe来定位元素(用于Python+selenium自动化测试)

    切换 iframe:1.由于登录按钮是在iframe上,所以第一步需要把定位器切换到iframe上2.用switch_to_frame方法切换,此处有id属性,可以直接用id定位切换 iframe 与 ...

  6. java学习(一) 环境搭建、hello world的demo

    本程序媛搞前端的,上班偶有空闲,不妨来学习学习,不然怎么包养小白脸,走上人生巅峰? 说实话,每个语言都相通,有了javascript的基础,并且有了两三年跟java打交道的经验,简单学习下java想必 ...

  7. c++面向对象程序设计总结(类的使用)

    本篇算是学习c++有关类的知识的一些易错点吧..... 并不是特别详细,以后会更新吧.... 几点并不关于类的东西 1.函数模板,用虚拟类型来实现模板的功能 #include<iostream& ...

  8. 如何通过阿里云APP进行域名备案?阿里云备案流程需要多久?

    如何通过阿里云APP进行域名备案? 1.准备备案材料(很多初次使用阿里云APP进行备案的同学会问备案需要准备哪些资料,不二版本下面就给大家一一列举出来) 个人备案需要材料: ⑴<用户网站备案授权 ...

  9. FFT(快速傅里叶变换)算法详解

    多项式的点值表示(Point Value Representation) 设多项式的系数表示(Coefficient Representation): \[ \begin{align*} \mathr ...

  10. Homebrew1.5之后安装PHP和扩展

    Homebrew 1.5 宣布放弃 homebrew/php, 转而使用homebrew/core维护, 详见https://brew.sh/2018/01/19/homebrew-1.5.0/ 于是 ...