我们再新建一个AmethodClass来,不实现任何接口

某个类的方法实现不需要继承任何接口。

如果 Spring 识别到所代理的类没有实现 Interface,那么就会使用 CGLib 来创建动态代理,原理实际上成为所代理类的子类

有需要执行方法的类:

package com.testcglibProxy;

/**
 * @author liuchaoOvO on 2019/2/21
 */
public class AmethodClass
{
    public void a(){
        System.out.println("====aaaaaaa===");
    }
    public void b(){
        System.out.println("====bbbbb===");
    }
    public static void before(){
        System.out.println("====before===");
    }
    public static void post(){
        System.out.println("====post===");
    }
}

cglib 动态代理类,实现MethodInterceptor

package com.testcglibProxy;


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

import java.lang.reflect.Method;

/**
 * @author liuchaoOvO on 2019/2/21
 */
public class CGLibProxy implements MethodInterceptor
{
    //私有静态化实例对象
    private static volatile CGLibProxy instance;
    //私有化构造函数
    private CGLibProxy(){};
    //公有静态化实例方法
    public static CGLibProxy getInstance(){
        if(instance==null){
            synchronized (CGLibProxy.class)
            {
                if (instance == null)
                {
                    instance = new CGLibProxy();
                }
            }
        }
        return instance;
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable
    {
        //随意找到前置执行方法
        AmethodClass.before();
        //重点为cglib动态代理方法的执行
        Object obj = methodProxy.invokeSuper(o, objects);
        //随意找到后置执行方法
        AmethodClass.post();
        return obj;
    }
    private Enhancer enhancer = new Enhancer();
    //生成为具体需要代理类的子类
    public <T> T getProxy(Class<T> clazz){
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(this);
        return (T) enhancer.create();
    }

}

生成具体cglib代理类的工厂方法  生成具体的实例

package com.testcglibProxy;

/**
 * @author liuchaoOvO on 2019/2/21
 */
public class ProxyFactory
{
    public static AmethodClass newCGLibProxy() {
        return CGLibProxy.getInstance().getProxy(AmethodClass.class);
    }
}

测试

package com.testcglibProxy;

/**
 * @author liuchaoOvO on 2019/2/21
 */
public class testMain
{
    public static void main(String agrs[]){
        AmethodClass amethodClass= ProxyFactory.newCGLibProxy();
        amethodClass.a();
        amethodClass.b();
    }
}

运行结果

CGLib 动态代理Demo

相关文章: