先说说为什么需要AOP
最简单的一个例子就是日志记录,如果想记录一些方法的执行情况,最笨的办法就是修改每一个需要记录的方法。但这,真的很笨。。。
好的方法,应该是通过反射获取方法,然后去匹配,如果需要记录日志,那就调用日志方法即可。
这就是AOP 的Weaving,俗称编织、织入,就是将需要添加的功能编织到现有功能中,而不需要修改现有代码。
另一个例子,不那么大众的需求:我想给一个对象添加方法,怎么实现?
如果有学过js、Python等动态语言,你肯定知道它们支持给对象添加方法,直接添加即可。
但是Java不行,因为Java的类型是封闭的。
Spring给出办法就是通过代理,拦截请求,然后去调用实际拥有该方法的对象的该方法!(略绕) 这就是Introduction,俗称引入。
如图:
这是书中自带的图片,很形象。
如图所示,如果调用Advised bean的Existing method,那就是Weaving(织入);如果调用introduced method,那就是Introduction。
但是,无论那种,Spring都是通过其代理功能实现的。(如果你已经知道Spring的代理功能仅限于method,那你也可以想到Spring AOP仅限于method --- 稍后讨论)
以上,记住一点就行:Spring AOP中,给方法添加功能就是织入,给对象添加功能就是引入。
(至于为什么强调是Spring AOP,这是因为还有其他的AOP框架,稍后讨论。)
再列一下其他概念:
Weaving织入部分: Advice : 需要添加的功能,例如日志功能、权限功能等,以及什么时候添加(目标方法执行前、后、异常等时候)。 Join-point : 目标类中能够添加功能的地方! Pointcut : 指定目标类中添加功能的地方!因为不可能给所有Join-point织入Advice!(Spring AOP仅限于方法,因为它基于代理实现。其他的框架还可以针对字段添加功能!了解就行。) 需要注意的是,Advice定义了什么时候做、做什么,而Pointcut则定义了在哪里做。 Aspect = Advices + Pointcuts // Aspect可以认为是一堆Advice的类,且其中指定了每个Advice执行的Pointcut。
Introduction引入部分: 暂无
以上,Pointcut是关键,它决定了一个AOP框架的行为。
因为Pointcut意味着where(field?method?exception?)和when(编译时?加载时?运行时?)。
【】通常,使用class和method name来定义Pointcut,或者使用正则表达式匹配class和method name来定义Pointcut!!!
<!-- 未完待续,先睡觉了。。 -->