分散关注
将通用需求功能从不相关类之中分离出来;同时,能够使得很多类共享一个行为,一旦行为发生变化,不必修改很多类,
只要修改这个行为就可以。
AOP概述
AOP就是这种实现分散关注的编程方法,它将“关注”封装在“方面”中。
AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向方面编程。AOP实际是GoF设计模式的延
续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。
AOP具体实现
AOP是一个概念,并没有设定具体语言的实现,它能克服那些只有单继承特性语言的缺点(如Java),目前AOP具体实现有以下几个项目:
AspectJ (TM): 创建于Xerox PARC. 有近十年历史,技术成熟。缺点:过于复杂;破坏封装;需要专门的Java编译器。
动态AOP:使用JDK的动态代理API或字节码Bytecode处理技术。
连接点(JoinPoint)
指那些被拦截到的点,在spring中,这些点指的是方法,因为spring只支持方法类型的连接点。
基本每个方法的前、后(两者都有也行),或抛出异常时都可以是连接点
通知(Advice)
指拦截到joinpoint之后所要做的事情,分为 前置通知、后置通知、异常通知(例外通知和最终通知)、环绕通知
例如:
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {//环绕通知(整个方法)
PersonServiceImp personServiceImp=(PersonServiceImp)this.targetObject;
Object result=null;
if(personServiceImp.getUser()!=null){
//前置通知
try{
result=methodProxy.invoke(this.targetObject, args);
//后置通知
}catch(Exception e){
//例外通知
}finally{
//最终通知
}
}
return result;
}
切入点(Pointcut)
上面说的连接点的基础上,来定义切入点,你的一个类里,有15个方法,那就有几十个连接点了对把,但是你并不想在所有方法附近都使用通知,
你只想让其中的几个,在调用这几个方法之前,之后或者抛出异常时干点什么,那么就用切点来定义这几个方法,让切点来筛选连接点,选中那几个你想要的方法。
切面(Aspect)
切面是通知和切入点的结合。现在发现了吧,没连接点什么事情,连接点就是为了让你好理解切点,搞出来的,明白这个概念就行了。
通知说明了干什么和什么时候干(什么时候通过方法名中的before,after,around等就能知道),而切入点说明了在哪干(指定到底是哪个方法),这就是一个完整的切面定义。
引入(introduction)
允许我们向现有的类添加新方法属性。这不就是把切面(也就是新方法属性:通知定义的)用到目标类中吗
目标(target)
引入中所提到的目标类,也就是要被通知的对象,也就是真正的业务逻辑,他可以在毫不知情的情况下,被咱们织入切面。而自己专注于业务本身的逻辑。
代理(proxy)
实现整套aop机制
织入(weaving)
把切面应用到目标对象来创建新的代理对象的过程。有3种方式,spring采用的是运行时