基于SpringAOP的代理设计模式编程式实现

代理目标及其实现类

package com.aop.example;
/***
 * TODO TCF 被代理的接口,基于jdk动态代理
 * @author 71485
 *
 */
public interface HelloAop {

    //TODO TCF 被代理的目标方法
    public void show(String name);
}

package com.aop.example;

/**
 * TODO TCF HelloAop接口实现类
 * @author 71485
 *
 */
public class HelloAopImpl implements HelloAop{
    
    @Override
    public void show(String name) 
    {
        System.out.println("======Hello,"+name+"======");
    }

}
 

1.静态代理

package com.aop.example.statics;

import org.apache.log4j.Logger;

import com.aop.example.HelloAop;

/***
 * TODO TCF 静态代理类
 * @author 71485
 *
 */
public class HelloAopProxy implements HelloAop{

    private Logger logger=Logger.getLogger(HelloAopProxy.class);
    
    //TODO TCF 构造注入的目标代理对象
    private HelloAop helloAop;
    
    public HelloAopProxy(HelloAop helloAop)
    {
        this.helloAop=helloAop;
    }
    
    //TODO TCF 前置增强
    public void before()
    {
        logger.debug("前置增强功能.....");
    }
    
    //TODO TCF 后置增强
    public void afterReturning()
    {
        logger.debug("后置增强功能.....");
    }

    //TODO TCF 汉堡=上中下
    public void show(String name)
    {
        before();
        helloAop.show(name);
        afterReturning();
    }
}
 

2.JDK动态代理

package com.aop.example.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import com.aop.example.HelloAop;

/***
 * TODO TCF 代理目标为接口的JDK动态代理DEMO
 * aop:aspectj-autoproxy proxy-target-class="false"
 * @author 71485
 *
 */
public class JDKDynamicProxy implements InvocationHandler{

    //TODO TCF 被代理的目标对象
    private HelloAop helloAop;
    
    public JDKDynamicProxy(HelloAop helloAop) 
    {
        this.helloAop=helloAop;
    }
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable 
    {
        //TODO TCF 动态代理,前置增强处理
        before();
        
        //TODO TCF 代理方法执行
        //TODO TCF 代理的目标实例,方法执行参数
        Object result=method.invoke(helloAop, args);
        
        //TODO TCF 动态代理,后置增强
        after();
        return result;
    }
    
    public void before()
    {
        System.out.println("JDK前置增强.....");
    }
    
    public void after()
    {
        System.out.println("JDK后置增强.....");
    }
    
    //TODO TCF 构建代理类实例并返回
    public HelloAop getProxy() 
    {
        //TODO TCF jdk动态代理
        //TODO TCF 创建代理实例,传入类加载器、代理目标类的接口、当前实现InvocationHandle接口的动态代理类实例
        return (HelloAop)Proxy.newProxyInstance(
                this.helloAop.getClass().getClassLoader(),
                this.helloAop.getClass().getInterfaces(), 
                this);
    }
}
 

3.CGLIB动态代理

package com.aop.example.dynamic;

import java.lang.reflect.Method;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import com.aop.example.HelloAopImpl;

/**
 * TODO TCF 代理任意目标类的CGLIB动态代理DEMO
 * aop:aspectj-autoproxy proxy-target-class="true"
 * @author 71485
 *
 */
public class CGLibDynamicProxy implements MethodInterceptor{

    //TODO TCF 代理的目标实例
    private HelloAopImpl helloAopImpl;
    
    //TODO TCF 创建代理实例并返回
    public Object getInstance(HelloAopImpl helloAopImpl)
    {
        this.helloAopImpl=helloAopImpl;
        Enhancer enhancer=new Enhancer();
        
        //TODO TCF 设置代理的目标
        enhancer.setSuperclass(HelloAopImpl.class);
        
        //TODO TCF 设置回调
        enhancer.setCallback(this);
        
        //TODO TCF 创建并返回代理类实例
        return enhancer.create();
    }
    
    @Override
    public Object intercept(Object obj, Method method, Object[] arg, MethodProxy methodProxy) throws Throwable 
    {
        before();
        
        Object result=methodProxy.invokeSuper(obj,arg);
        
        after();
        
        return result;
    }
    
    //TODO TCF 前置增强
    public void before()
    {
        System.out.println("CGLIB动态代理——前置增强......");
    }
    
    //TODO TCF 后置增强
    public void after()
    {
        System.out.println("CGLIB动态代理——后置增强......");
    }

}
 

4.封装通用的JDK动态代理类

package com.aop.example.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/***
 * TODO TCF 基于单例模式封装通用的JDK动态代理类
 * @author 71485
 *
 */
public class JDKDynamicProxyRebuild implements InvocationHandler{

    //TODO TCF 目标代理实例
    private Object target;
    
    //TODO TCF 构造注入目标代理实例
    public JDKDynamicProxyRebuild(Object target)
    {
        this.target=target;
    }
    
    //TODO TCF 创建代理类实例
    //TODO TCF 代理目标入参,返回对应类型的动态代理类实例
    @SuppressWarnings("unchecked")
    public <T> T getProxy(Class<T> obj)
    {
        return (T)Proxy.newProxyInstance(
                   target.getClass().getClassLoader(),
                   target.getClass().getInterfaces(),
                   this
                );
    }
    
    //TODO TCF 代理织入和执行
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable 
    {
        before();
        
        Object result=method.invoke(target, args);
        
        after();
        
        return result;
    }
    
    //TODO TCF 前置增强
    public void before()
    {
        System.out.println("JDK动态代理封装——前置增强......");
    }
    
    //TODO TCF 后置增强
    public void after()
    {
        System.out.println("JDK动态代理封装——后置增强......");
    }
}
 

5.封装通用的CGLIB动态代理类

package com.aop.example.dynamic;

import java.lang.reflect.Method;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

/**
 * TODO TCF 基于CGLIB动态代理封装的通用动态代理类
 * @author 71485
 *
 */
public class CGLibDynamicProxyRebuild implements MethodInterceptor{

    //TODO TCF 代理类实例
    private static CGLibDynamicProxyRebuild dynamicProxy=new CGLibDynamicProxyRebuild();
    
    //TODO TCF 私有构造,外界无法创建动态代理类实例
    private CGLibDynamicProxyRebuild()
    {
        
    }
    
    //TODO TCF 单例模式,饿汉模式:类加载速度慢,获取对象速度快,线程安全,不能延迟加载 
    public static CGLibDynamicProxyRebuild getInstance()
    {
        return dynamicProxy;
    }
    
    //TODO TCF 创建动态代理类实例
    @SuppressWarnings("unchecked")
    public <T> T getProxy(Class<T> cls)
    {
        return (T)Enhancer.create(cls,this);
    }
    
    //TODO 代理织入和执行
    @Override
    public Object intercept(Object target, Method method, Object[] args, MethodProxy methodProxy) throws Throwable 
    {
        before();
        
        Object result=methodProxy.invokeSuper(target,args);
        
        after();
        
        return result;
    }
    
    //TODO TCF 前置增强
    public void before()
    {
        System.out.println("CGLIB动态代理封装——前置增强......");
    }
    
    //TODO TCF 后置增强
    public void after()
    {
        System.out.println("CGLIB动态代理封装——后置增强......");
    }
}
 

6.测试类测试结果

package com.aop.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.aop.example.HelloAop;
import com.aop.example.HelloAopImpl;
import com.aop.example.dynamic.CGLibDynamicProxy;
import com.aop.example.dynamic.CGLibDynamicProxyRebuild;
import com.aop.example.dynamic.JDKDynamicProxy;
import com.aop.example.dynamic.JDKDynamicProxyRebuild;
import com.aop.example.statics.HelloAopProxy;

public class Test {

    @SuppressWarnings(value = "unchecked")
    public static void main(String[] args) 
    {
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext-mybatis.xml");
        
        //TODO TCF JDK Dynamic Proxy
        HelloAop helloAop=new HelloAopImpl();
        JDKDynamicProxy proxy=new JDKDynamicProxy(helloAop);
        proxy.getProxy().show("zhangsan");
        
        //TODO TCF CGLIB Dynamic Proxy
        HelloAopImpl helloAopImpl=new HelloAopImpl();
        CGLibDynamicProxy proxy2=new CGLibDynamicProxy();
        Object cglibProxy=proxy2.getInstance(helloAopImpl);
        HelloAopImpl realProxy=(HelloAopImpl)cglibProxy;
        realProxy.show("lisi");
        
        //TODO TCF JDK Dynamic Proxy Rebuild
        HelloAop helloAop2=new HelloAopImpl();
        JDKDynamicProxyRebuild rebuild=new JDKDynamicProxyRebuild(helloAop2);
        HelloAop proxy3=rebuild.getProxy(HelloAop.class);
        proxy3.show("wangwu");
        
        //TODO TCF CGLIB Dynamic Proxy Rebuild
        CGLibDynamicProxyRebuild rebuild2=CGLibDynamicProxyRebuild.getInstance();
        HelloAopImpl helloAopImpl2=rebuild2.getProxy(HelloAopImpl.class);
        helloAopImpl2.show("zhaoliu");
        
    }
}

基于SpringAOP的代理设计模式编程式实现