前提
在阅读本篇博文之前,请先阅读上篇博文【AOP系列】(一)—静态代理VS动态代理(Java) ,因为下文中在解释一些概念时,会用到上篇博文中的例子。
思维导图
概念解释
横切性关注点(Cross Cutting Concern):独立服务,如系统日志。如果不是独立服务(与业务耦合)就不能横切了。通常这种独立服务需要遍布系统各个角落,遍布在业务流程之中。
切面(Aspect):日志服务会单独写到一个类中,如LogHandler,这个类叫做切面。基于AOP的编程关键是能找到横切性的关注点,形成切面。
模块化:把日志这种服务单独抽到一个类中,这一过程称作模块化。
Advice:在LogHandler这个类中对日志服务做的具体实现(也就是对横切性关注点的具体实现):可以是一句代码(system.out.println),也可是一个方法。Advice可以分类:BeforeAdvice,AfterAdvice,区别在于Advice在目标方法之前调用还是之后调用,Throw Advice 表示当目标发生异常时调用Advice。
PointCut(看做一种约束):指Advice会应用在目标对象的哪些目标方法中,如只应用再add,delete,modify方法上,不应用在select方法上,实际当中需要用表达式进行限制。
Target Object:目标对象。
JoinPoint:在目标对象中,将会应用Advice的方法或属性(AspectJ支持将属性作为JoinPoint),这些叫做连接点。
织入(Weave):即Advice应用在JoinPoint的过程,这个过程有个专业术语,不叫应用,叫织入:
Proxy:(可有可无),动态织入创建代理效率慢,有些是在编译时静态织入,不会产生代理类。
Introduction:动态为某个类增加或减少方法(这个暂时不理解,先写到这里)。
总结
了解这些概念,不是为了让大家记住,而是更好地去理解AOP思想。虽然AOP的全称是Aspect Oriented Programming,但是经我一总结,也可以解释为Aspect,Object(Target Object),Proxy。也是蛮有意思的啊!