一、CGLibProxy实现MethodInterceptor
package test.spring.proxy;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class CGLibProxy<T> implements MethodInterceptor {
//创建代理对象
public T getProxy(Class clazz) {
//创建一个增强器对象
Enhancer enhancer = new Enhancer();
//使用增强器创建一个代理对象
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
//返回增强对象
return (T) enhancer.create();
}
/**
* @param obj CGlib根据指定父类生成的代理对象
* @param method 拦截的方法
* @param args
* @param proxy 方法的代理对象,用于执行父类的方法
* @return
*/
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
/*参数一:CGLIB根据指定的父类生成的代理对象
* 参数二:拦截的方法
* 参数三:拦截方法的参数数组
* 参数三:方法的代理对象,可以执行父类中的方法*/
//对原始方法进行增强
// System.out.println(method);
System.out.println("方法执行之前。。。。");
//执行父类中的原始方法
Object result = proxy.invokeSuper(obj, args);
//方法结束后执行增强
System.out.println("方法执行之后.....");
//返回原始方法的执行结果
return result;
}
}
二、CGLibProxyAction
1.接口
package test.spring.proxyServices;
public interface IUserDao {
public int getNum();
}
2.实现类
package test.spring.proxyServices.Impl;
import org.springframework.stereotype.Repository;
import test.spring.proxyServices.IUserDao;
@Repository
public class UserDao1 implements IUserDao {
public int getNum() {
return 111;
}
}
3.测试
package test.spring.Controller.proxy;
import org.junit.Test;
import test.spring.proxy.CGLibProxy;
import test.spring.proxyServices.IUserDao;
import test.spring.proxyServices.Impl.HelloImpl;
import test.spring.proxyServices.Impl.UserDao1;
public class CGLibProxyAction {
@Test
public void cgLibTest(){
CGLibProxy<HelloImpl> cgLibProxy = new CGLibProxy<HelloImpl>();
HelloImpl helloService = cgLibProxy.getProxy(HelloImpl.class);
IUserDao userDao = new UserDao1();
helloService.setIUserDao(userDao);
System.out.println(helloService.sayHello("TTTTOM"));
}
}