利用CGLib实现动态代理实现Spring的AOP

当我们用Proxy 实现Spring的AOP的时候, 我们的代理类必须实现了委托类的接口才能实现。 而如果代理类没有实现委托类的接口怎么办? 那么我们就可以通过CGLib来实现

 

package cn.gbx.aop;
 
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
 
import cn.gbx.service.impl.PersonService;
 
public class ProxyFactory implements InvocationHandler{
    private Object targetObject;
     
    public Object createProxyInstance(Object targetObject) {
        this.targetObject = targetObject;
        return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(),
                this.targetObject.getClass().getInterfaces(), 
                this);
    }
 
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        PersonService service = (PersonService) this.targetObject;
        Object result = null;
        if (service.getUser() != null) {
            result = method.invoke(this.targetObject, args);
        }
        return result;
    }
}

  

AOP中的一些概念:

Aspect(切面):指横切性关注点的抽象即为切面,它与类相似,只是两者的关注点不一样,类是对物体特征的抽象,而切面横切性关注点的抽象.

 

joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点,实际上joinpoint还可以是field或类构造器)

 

Pointcut(切入点):所谓切入点是指我们要对那些joinpoint进行拦截的定义.

 

Advice(通知):所谓通知是指拦截到joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知

 

Target(目标对象):代理的目标对象

 

Weave(织入):指将aspects应用到target对象并导致proxy对象创建的过程称为织入.

 

Introduction(引入):在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.

 

 

posted @ 2014-02-22 13:09  E_star  阅读(600)  评论(0编辑  收藏  举报