Spring AOP

概念
AOP (Aspect Oriented Programming)是一种面向切面的编程的思想.

为什么用使用AOP
在写代码的过程中,如果把业务的核心代码和其他的一些代码堆放在一起,会造成代码的耦合度很高,不利于为维护,而导致牵一发动全身.如果使用面向对象OOP的思想,把每个业务逻辑中的公共方法都抽取出来作为一个公共类公共方法,需要就调用,但仍然还是需要去引用这个类然后去调用这个方法.为了解决重复代码,维护麻烦的问题,使用AOP动态的,不影响原先代码前提下执行的.

什么是切面(Aspect)
切面是是通知和切点的结合,一个切面就可以规定了在什么时候什么位置做什么事,例如在核心程序类执行前调用某个切面的通知

什么是切点(Pointcut)
切点存在于切面里面,我们需要定义这个不同的切点在哪些连接点上执行通知,如果说通知规定了切面是在什么时候,干了什么事的话,那么切点就是规定在哪个位置下去去切入这个切面

什么是通知
在AOP中,通知分为以下几种通知

  • 前置通知,Begore
  • 后置通知,After(在目标方法完成之后调用通知,此时不会关心方法的输出是什么)
  • 返回通知,After-returning(在目标方法成功执行之后调用通知)
  • 异常通知,After-throwing(抛出异常的通知)
  • 环绕通知,Around,这是个很强大的通知,使用try...catch能够代替前面四种通知

什么是连接点
连接点是在应用执行过程中能够插入切面的一个点,简单来说就是调用切点的那个方法.一般连接点就是核心业务.

切入点表达式:通常在项目中的用法execution(* *..*Service.*(..))
可以按照顺序读一下
execution是必须的
public修饰符可以省略,execution(public * *..*Service.*(..))
修饰符省略的情况下返回值不能省略execution(*int *..*Service.*(..))这种就是错误的
*.. 表示多重包下
*Service 表示Service结尾的类名
*表示所有方法
(..)表示所参数列表任意

切入点表达式的使用
一般使用统一管理切入点的方式

引入切入点

统一的管理切入点的类

参考代码

@Aspect
@Component
@Order(3)
public class LogAspect {
    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Pointcut("execution(* *..*Service.*(..))")
    public void pointCutDecoration(){
    }
    @Before("com.ycy.aop.aspect.PointCut.pointCutDecoration()")
    public void printLogBeforeCoreOperation(JoinPoint joinPoint){
        //通过spring传入的JoinPoint对象获取方法名,方法实参,返回值,异常信息
        String targetMethodName = joinPoint.getSignature().getName();
        Object[] args = joinPoint.getArgs();
        //把数组转成集合方便打印,调用Arrays的静态方法
        List<Object> argumentList = Arrays.asList(args);
        logger.debug("[AOP前置通知--------]"+"[目标方法:]"+targetMethodName+"[方法实参:]"+argumentList);
    }
    @AfterReturning(value = "com.ycy.aop.aspect.PointCut.pointCutDecoration()",returning ="returnValue" )
    public void printLogAfterCoreOperation(JoinPoint joinPoint,Object returnValue){
        logger.debug("[AOP返回通知--------]"+"[返回值:]"+returnValue);
    }

    @AfterThrowing(value = "com.ycy.aop.aspect.PointCut.pointCutDecoration()",throwing = "throwable")
    public void printLogAfterCoreOperationFailed(JoinPoint joinPoint,Throwable throwable){
        //从传入的throwable对象的原因
        Throwable cause = throwable.getCause();
        //循环查找原因,直到cause为null
        while (cause!=null){
            throwable =cause;
            //如果这个cause为null了,那么异常信息就停留在throwable了
            cause = throwable.getCause();
        }
        String throwableName = throwable.getClass().getName();
        String message = throwable.getMessage();
        String s = throwable.toString();
        logger.debug("[AOP异常通知--------]"+"[异常类型:]"+throwableName+"[异常信息是:]"+message);
        logger.debug("[AOP异常通知--------]"+"[异常信息是:]"+s);
    }
    @After("com.ycy.aop.aspect.PointCut.pointCutDecoration()")
    public void printLogAfterCoreOperationFinished(JoinPoint joinPoint){
        String name = joinPoint.getSignature().getName();
        logger.debug("[AOP后置通知--------]"+"[目标方法;]"+name);
    }
}

打印结果


打印结果

@Order注解的使用
在开发过程中,可能会有多个切面的存在,我们需要规定切面的优先级
@Order(较小的数):优先级高
@Order(较大的数):优先级低
经典的应用场景就是缓存切面和事务切面,如果事务的切面优先于缓存的切面的话,会让所有的请求都去开启事务查询数据库,频繁操作数据库这是非常不合理的,所以应该把缓存切面的优先级高于事务切面,一旦有请求进来,应该先查询缓存,一旦缓存有数据就直接返回,不去查询数据库,如果缓存没有该数据才进数据库,并且查到后也应该再把数据置于缓存.

...
先到这


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容