spring简单回顾二
用JDK做代理的前提是被代理对象具有接口,通过代理对象实现被代理对象的接口来进行代理。
用CGLib则没有这方面的要求,下面看下CGLib的实现:
package com.li.info.manager;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CGLibProxyObjectFactory implements MethodInterceptor {
private Object targetObject;
public Object createProxyInstance (Object targetObject) {
this.targetObject = targetObject;
Enhancer enhancer = new Enhancer(); // 该类用于生成代理对象
enhancer.setSuperclass(this.targetObject.getClass()); // 设置父类
enhancer.setCallback(this); // 设置调用对象为本身
return enhancer.create();
}
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
Object retVal;
if (method.getName().equals("add")) {
System.out.println("before method"); //前置
retVal = methodProxy.invoke(targetObject, args);
System.out.println("after method");
}
retVal = method.invoke(targetObject, args);
return retVal;
}
}
Aspect(切面):指横切性关注点的抽象即为切面,它与类相似,只是两者的关注点不一样,类是对物体特征的抽象,而切面石堆横切性关注点的抽象。
jointpoint(连接点):所谓连接点是指那些拦截到的的点,在spring中,这些点指的是方法,因为spring只支持方法类型的连接点,实际上joinpoint还可以是field或类构造器。
Pointcut(切入点):所谓切入点是指那些我们要对那些joinpoint进行拦截的定义。
Advice(通知):所谓通知是指拦截到jointpoint之前的即为前置通知,之后的即为后置通知,异常通知,最终通知,环绕通知。
Target(目标对象):代理的目标对象
Weave(织入):指将aspect应用到target对象并导致proxy对象创建的过程称为织入。
Introduction(引入):在不修改类代码的前提下,Introduction可以在运行期为类动态地添加一些方法或Field。
使用Spring进行面向切面(AOP)编程
Spring提供了两种切面的使用方式,实际工作中我们可以选用其中一种:
基于XML配置方式进行AOP开发
基于注解方式进行AOP开发
方法一,基于注解方式声明切面:
<aop:aspectj-autoproxy />
目的打开aopnnotation 注释处理器