我们再新建一个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();
}
}
运行结果