码迷,mamicode.com
首页 > Web开发 > 详细

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

时间:2019-04-27 13:18:23      阅读:350      评论:0      收藏:0      [点我收藏+]

标签:声明   ack   world   logging   连接   spec   ponitcut   empty   strong   

假设我们有一个很普通的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吗?

标签:声明   ack   world   logging   连接   spec   ponitcut   empty   strong   

原文地址:https://www.cnblogs.com/DrinkTeaT/p/10778163.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!