你真的了解 advice, joinpoint,pointcut,aspect吗?

Posted drinkteat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你真的了解 advice, joinpoint,pointcut,aspect吗?相关的知识,希望对你有一定的参考价值。

假设我们有一个很普通的Employee类,在某些方法被调用时,这个类里的方法也被调用。

class Employee{
    public String getName(int id){....}
    private int getID(String name){...}
}
那么这些方法我们称之为连接点(JoinPoints)
那怎么才能让这些连接点能被spring框架找到并且识别呢。只需要写个正则表达式就行,而这个正则表达式就是切点(PonitCut);
例如:
* * mypackage.Employee.get*(*)
第一个星星表示连接点的修饰词private/public/..,第二个星星是返回类型。
在这个定义好了这后,spring也能找到,还有两个问题要解决:
1.什么时候调用连接点-eg 在某个方法执行前/后/抛出异常等等
2.在连接点方法被执行了之后,连接点方法需要做那些事(可能就打印出个 "hello world!"或者什么也不干)
完成以上两点我们称之为Advice(通知)。
例如:
@Before("execution(* * mypackage.Employee.get*(*))")
public void doBeforeLogging() {....}

@After("execution(* * mypackage.Employee.get*(*))")
public void doAfterLogging() {....}

通知的工作就完成了,但是我们发现execution括号内的东西太长了,如果需要换个连接点方法,岂不是要把所有的类都翻一遍?
解决方法就像是提取常量一样,将切点也提取出,就像这样:
@Pointcut("execution(* * mypackage.Employee.get*(*))") <-- Note the introduction of Pointcut keyword
public void allGetterLogging(){} <-- This is usually empty

@Before("allGetterLogging")
public void doBeforeLogging() {....}

@After("allGetterLogging")
public void doAfterLogging() {....}
最后我们可以用@Aspect声明这是一个切面类。

以上是关于你真的了解 advice, joinpoint,pointcut,aspect吗?的主要内容,如果未能解决你的问题,请参考以下文章

joinpoint可以打开excel

Spring中的AOP——在Advice方法中获取目标方法的参数

Spring_7AOP之Advice应用

Spring的通知(Advice)

浅析:AOP的advice和advisor创建过程

Spring 注解--AOP篇