AOP(Aspect-Oriented Programming)
1.面向切面编程
2.对传统的oop的补充
3.不是取代oop,经常和oop一起使用
切面:需要实现的交叉功能
连接点:应用程序执行过程中插入切面的地点:此处可是方法调用、异常抛出甚至是要修改的字段
通知:通知切面的实际实现。他通知应用系统新的行为,通知在连接点插入到应用系统中
切入点:定义了通知应该应用在那些连接点。通常通过指定类名和方法名,或匹配类名和方法名式样的正则表达式来指定切入点。
引入:允许为已存在类添加新方法和属性
目标对象:被通知对象。即可使编写的类也可是添加定制行为的第三方类。
代理:将通过应用到目标对象后创建的对象。
织入:将通知应用到目标对象从而创建一个新的代理对象的过程。切面在指定接入点被织入到目标对象中,之如发生在目标对象生命周期的多个点上:
编辑器:切面在目标对象编译时织入(需特殊的编译器)
类装载器:切面在目标对象被载入到JVM时织入(需特殊的类加载器,在类的载入到应用系统之前增强目标对象的字节码)
运行期:切面在应用系统运行时织入(通常,AOP容器将在织入切面时动态生成委托目标对象的代理对象)
前置通知 接口MethodBeforeAdvice
package com.users.advices
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
import com.users.util.Md5Encode;
public class Md5Advice implements MethodBeforeAdvice{
}
Bean.xml配置
后置通知 接口AfterReturningAdvice
package com.users.advices;
import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
public class ScoreAdvice implements AfterReturningAdvice{
}
环绕通知 接口MethodInterceptor
package com.users.advices;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class TimeAdvice implements MethodInterceptor{
}
环绕通知与前两种通知的区别:
1.该通知能够控制目标方法是否被调用。通过invocation.proceed()方法来调用。
2.该通知可以控制返回值。可以返回一个与proceed()方法返回对象完全不同的对象。
异常通知 接口ThrowsAdvice
public Error
}
该接口没有任何方法,但实现该接口的类必须要有如下形式的方法:
void afterThrowing(Throwable throwable);
void afterThrowing(Method m,Object[] os,Objecttarget,Throwablethrowable);
第一个方法只接受一个参数:需要抛出的异常。
第二个方法接受异常、被调用的方法、参数以及目标对象。