0%

AOP注解应用

[toc]

  • 增加了@AspectJ注解形式的AOP使用方式

    注意只是使用方式变了,底层的实现逻辑和基本概念还是相同的。

    注解形式的pointcut:
    可通过注解直接定义pointcut内容,就不需要实现里面的方法了
    这里的方法名仅仅是作为1个代号,代号可以提供给其它的pointcut去合并使用

    下面这个图,二者标识的pointcut其实是一样的
    82adc5bbf93caa060e7649ff9c73c9c3370480e7

    引用时也能包含包名

    pointcut表达式符号:
    execution(指定方法签名,支持通配): 标识仅支持方法执行类型的joinPoint
    并支持方法参数识别
    93ad48e07377ac8591a10b2564b89e7845238640

    within 匹配
    只能和包路径相关
    0c416b8d211008bddc39219e2ba16087ffefb398

    @within(注解类名)
    比上面多了个@,相当于只切入标注了某个注解的方法,且只用于对象是否标注了这个注解类名的注解

    this(objectType)
    当目标对象的代理对象是objectType,则切入

    target(objectType)
    当目标对象是objectType,则切入
    eb927a4ab949516c2436f86038ed53c1cc00d4e3
    9921eefea0e72b57b2ae905ef1d340d8ccbd9173
    @target(注解类型)
    如果对象的目标对象 拥有target括号里的注解类型,则切入

    args
    指定方法输入参数
    6150e3e656d5bf81f4cfe3d77d02dd5d223dd52b

    @annotation
    系统内所有标注了annotation的方法,都会切入。 和@within的区别在于前者是方法,后者是对象
    372535ab8ea8a2c77bf69b070a2c05bcde4cb335

    注解形式的Advice
    56a84406b604aecce420c12d942ba93526f26998
    可以和pointcut 合并?

    cad1ea69bdfce12bff029f46bbe9848b12322677

    ae8ce5ca694623441181af71dca6155d822e9e68

    0e176c14cd01488fe4e90e65cabf0f582d80c46e
    @AspectJ的注意事项:

    如果类中定义了多个相同位置的@advice, 则执行顺序取决于声明顺序

    070bcb0b29a519f5d2d842885461f5681c4e5bb2
    如果有多个AspectJ类, 然后不同aspectJ的advice冲突了,怎么办?
    需要实现Order接口,否则是不确定顺序
    96574a574ffed6e4dee6477a922da1a12a5d2051

    也可以指定实例化的方式,默认是单例实例化。

    4b69c4b45e1e1a67ba51196cf7654e1a2982daef

    嵌套执行代理的问题:
    f6a306ee8b151bbc9b210a7083de0a3bb16e3bd6
    79b459a1b92d33b253f8db3ae3250cb4ce30882c

    如果执行method1, 只会进行method1的代理, method2并不会动, 这是因为底层原理,导致 我们生成1个method1的代理后, 执行时里面的method2并不会动, 即method1的代理里没有method2的代理,。
    之所叫横切,就是因为他会切入到同一个逻辑层上,
    如果需要层层横切,需要在method1里调用method2的代理
    052b9e9888e60902ec8e7596f59f7300bbe3bb63
    而这个代理可以用注入的方式,不要在这里写死。https://www.cnblogs.com/cloudwill/p/13648539.html)