你真的了解 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吗?的主要内容,如果未能解决你的问题,请参考以下文章