springaop术语概述及aop中常见通知的实现(前置,后置,环绕,异常)
AOP术语概述
n 切面:需要实现的交叉功能
n 连接点:应用程序执行过程中插入切面的地点:此处可是方法调用、异常抛出甚至是要修改的字段
n 通知:通知切面的实际实现。他通知应用系统新的行为,通知在连接点插入到应用系统中
n 切入点:定义了通知应该应用在那些连接点。通常通过指定类名和方法名,或匹配类名和方法名式样的正则表达式来指定切入点。
n 引入:允许为已存在类添加新方法和属性
n 目标对象:被通知对象。即可使编写的类也可是添加定制行为的第三方类。
n 代理:将通过应用到目标对象后创建的对象。
n 织入:将通知应用到目标对象从而创建一个新的代理对象的过程。切面在指定接入点被织入到目标对象中,之如发生在目标对象生命周期的多个点上:
u 编辑器:切面在目标对象编译时织入(需特殊的编译器)
u 类装载器:切面在目标对象被载入到JVM时织入(需特殊的类加载器,在类的载入到应用系统之前增强目标对象的字节码)
u 运行期:切面在应用系统运行时织入(通常,AOP容器将在织入切面时动态生成委托目标对象的代理对象)
前置通知
public class WelcomeAdvice implements MethodBeforeAdvice{
public voidbefore(Method m,Object[] os,Object target){
Customer c =(Customer)arg[0];
System.out.println(c.getName());
}
}
---------------------------------------------
//创建目标代理对象
<bean id="kwikEMartTarget"class="…ApuKwikEMart" />
<bean id="welcomeAdvice"class="…WelcomeAdvice" />
<bean id="kwikEMart"class="……ProxyFactoryBean">
<propertyname="proxyInterfaces"><value>……KwikEMart</value></property>
<propertyname="interceptorNames">
<list><value>welcomeAdvice</value></list>
</property>
<propertyname="target"><ref bean="kwikEMartTarget"/></property>
</bean>
后置通知
public interface AfterReturningAdvice{
public void afterReturning(ObjectreturnValue,Method
m,Object[] os,Object target);
}
环绕通知
publicinterface MethodInterceptor extends Interceptor{
Object invoke(MethodInvocation invocation);
}
该接口同前两种通知有两个重要区别:1.该通知能够控制目标方法
是否真的被调用。通过invocation.proceed()方法来调用。
2.该通知可以控制返回的对象。可以返回一个与proceed()方法返回对象完全不同的对象。但要谨慎使用。
异常通知
publicinterface ThrowsAdvice{
}
该接口为标识性接口,没有任何方法,但实现该接口的类必须要有如下形
式的方法:
voidafterThrowing(Throwable throwable);
voidafterThrowing(Method m,Object[] os,Object
target,Throwablethrowable);
第一个方法只接受一个参数:需要抛出的异常。
第二个方法接受异常、被调用的方法、参数以及目标对象。