spring AOP
spring支持四种拦截类型:目标方法调用前,目标方法调用后,目标方法调用前后,方法抛出异常。
spring Aop采用动态代理的方式生成代理类,前面分析过动态代理和静态代理以及区别,可以点击我的博客。
一些术语解释。
连接点:
程序的某个位置,就是程序也就是类里的方法,一个类可以有多个方法,多个连接点,就是在这些方法前后异常等做文章。
切点:
可能会和连接点混淆,类里有多个连接点,那么程序或者项目执行的时候如何找到对应的连接点?切点就是做这个工作的,
切点帮你定位到对应的连接点,然后执行那四种拦截,进行增强。
增强:
切点定位到具体的连接点,定位到了,我们需要对其做点什么,不能就定位到了那里就完事吧。增加就是对目标类的连接点也就是方法
执行一段逻辑。
目标对象:
被一个或者多个切面所通知的对象。
织入:
织入就是把增强类加入到目标类的里的具体连接点上,Aop有三种织入方式,编译器织入,装载器织入,动态代理织入。
切面:由增强和切点组成,横切关注点。
Spring 对AOP的支持,目前比较流行的两种方式,一是spring 本身支持AOP的方式,二是就是比较流行的框架Aspectj。
先来说说spring本身对AOP的支持。
异常通知拦截,为什么先说这个,因为这个ThrowsAdvice接口里面什么都没有,不像AfterAdvice,MethodBeforeAdvice,MethodInterceptor
这几种方式,有方法实现。
异常抛出通知:
package com.lw.rpc.test;
import java.lang.reflect.Method;
import net.sf.cglib.reflect.FastClass;
import net.sf.cglib.reflect.FastMethod;
import org.springframework.aop.ThrowsAdvice;
import org.springframework.aop.framework.ProxyFactory;
/**
* ThrowsAdvice 异常统计拦截
*
* @author
*
*/
public class SpringAopAdvice implements ThrowsAdvice {
/**
* 对未知异常的处理.
*/
public void afterThrowing(Method method, Object[] args, Object target, NumberFormatException ex) throws Throwable {
System.out.println("出现异常的类: " + target.getClass().getName());
System.out.println("出现异常的方法: " + method.getName());
System.out.println(" 具体什么异常 : " + ex.getClass().getName());
}
public static void main(String[] args) {
SpringAopBean bean = new SpringAopBean();
ProxyFactory pf = new ProxyFactory();
pf.setTarget(bean);
pf.addAdvice(new SpringAopAdvice());
SpringAopBean proxy = (SpringAopBean) pf.getProxy();
try {
// 测试
proxy.aopMethod1("spring");
} catch (Exception e) {
e.printStackTrace();
}
}
}
目标类:
package com.lw.rpc.test;
public class SpringAopBean {
public void aopMethod() throws NullPointerException {
System.out.println("空指针异常");
}
public int aopMethod1(String numStr) throws NumberFormatException {
int num = Integer.parseInt(numStr);
return num;
}
}
其他的几种方式,实现AfterAdvice,MethodBeforeAdvice,MethodInterceptor这三个接口就可以实现。