感谢ITCAST发布的免费视频
在类没有提供接口的情况下,这时候需要用到一个第三方的CGLIB
import java.lang.reflect.Method;
import com.inventec.service.impl.PersonServiceBean;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CGlibProxyFactory implements MethodInterceptor{
private Object targetObject;
public Object createProxyInstance(Object targetObject) {
this.targetObject = targetObject;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.targetObject.getClass());//override the methods which are not final of the target object
enhancer.setCallback(this);
return enhancer.create();
}
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
// TODO Auto-generated method stub
PersonServiceBean bean = (PersonServiceBean) this.targetObject;
Object result = null;
if (bean.getUser() != null) {
result = methodProxy.invoke(targetObject, args);
}
return result;
}
}
分三步:
1. 创建Enhancer
2. 设置目标对象为超类
3. 创建对象
这样就产生了一个目标对象的子类
可以在调用方法前,后,以及出现例外时处理,无论抛不抛异常都会执行的方法
分别为前置通知,后置通知,例外通知,最终通知
还有一种叫做环绕通知,可以决定是否决定业务方法。
AOP中的概念
Aspect(切面):指横切性关注点的抽象即为切面,它与类很相似,只是两者的关注点不一样,类是对物体特征的抽象,而切面是横切性关注点的抽象。
Joinpoint(连结点):所谓连结点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连结点,实际上joinpoint还可以是field或类构造器。
Pointcut(切入点):所谓切入点是指我们要对那些joinpoint进行拦截的定义。
Advice(通知):所谓通知是指拦截到joinpoint之后要做的事情就是通知。通知分为前置通知,后置通知,异常通知,最终通知,环绕通知。
Target(目标对象):代理的目标对象。
Weave(织入):指将aspects应用到target对象并导致proxy对象创建的过程为织入。
Introduction(引入):再不修改类代码的前提下,Introduction可以在运行期为类动态添加一些方法或Field.