[toc]
-
增加了@AspectJ注解形式的AOP使用方式
注意只是使用方式变了,底层的实现逻辑和基本概念还是相同的。
注解形式的pointcut:
可通过注解直接定义pointcut内容,就不需要实现里面的方法了
这里的方法名仅仅是作为1个代号,代号可以提供给其它的pointcut去合并使用下面这个图,二者标识的pointcut其实是一样的
引用时也能包含包名
pointcut表达式符号:
execution(指定方法签名,支持通配): 标识仅支持方法执行类型的joinPoint
并支持方法参数识别
within 匹配
只能和包路径相关
@within(注解类名)
比上面多了个@,相当于只切入标注了某个注解的方法,且只用于对象是否标注了这个注解类名的注解this(objectType)
当目标对象的代理对象是objectType,则切入target(objectType)
当目标对象是objectType,则切入
@target(注解类型)
如果对象的目标对象 拥有target括号里的注解类型,则切入args
指定方法输入参数
@annotation
系统内所有标注了annotation的方法,都会切入。 和@within的区别在于前者是方法,后者是对象
注解形式的Advice
可以和pointcut 合并?
@AspectJ的注意事项:如果类中定义了多个相同位置的@advice, 则执行顺序取决于声明顺序
如果有多个AspectJ类, 然后不同aspectJ的advice冲突了,怎么办?
需要实现Order接口,否则是不确定顺序
也可以指定实例化的方式,默认是单例实例化。
嵌套执行代理的问题:
如果执行method1, 只会进行method1的代理, method2并不会动, 这是因为底层原理,导致 我们生成1个method1的代理后, 执行时里面的method2并不会动, 即method1的代理里没有method2的代理,。
之所叫横切,就是因为他会切入到同一个逻辑层上,
如果需要层层横切,需要在method1里调用method2的代理
而这个代理可以用注入的方式,不要在这里写死。https://www.cnblogs.com/cloudwill/p/13648539.html)