动态代理
一般有三种代理方式,静态代理,jdk自带的动态代理和cglib动态代理。在我的git上有具体demo的源码,这里整合cglib的使用和相关的工具类
cglib动态代理实例
用来代理和封装真实主题的类,他实现了net.sf.cglib.proxy.MethodInterceptor的接口,可以用来添加代理的逻辑,这里用来日志代理。
public class LogInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println(String.format("log start time [%s] ", new Date()));
Object result = methodProxy.invokeSuper(o, objects);
System.out.println(String.format("log end time [%s] ", new Date()));
return result;
}
}
真实主题角色接口和实现类
public interface UserService {
void insert(Object user);
void update(Object user);
Object list();
}
public class UserServiceImpl implements UserService {
@Override
public void insert(Object user) {
System.out.println("这里是添加用户实现");
}
@Override
public void update(Object user) {
System.out.println("这里是添加用户实现");
}
@Override
public Object list() {
System.out.println("这里是用户列表实现");
return new Object();
}
}
创建代理类的通用工具类
public class CglibProxyUtil {
/**
* 定义代理的生成方法,用于创建代理对象
*
* @param interceptor 代理补充的逻辑
* @param targetClass 需要代理的类
* @param <T> 需要代理的类的类型
* @return 代理类
*/
public static <T> T createProxyObject(MethodInterceptor interceptor, Class<T> targetClass) {
Enhancer enhancer = new Enhancer();
// 为代理对象设置父类,即指定目标类
enhancer.setSuperclass(targetClass);
enhancer.setCallback(interceptor);
return (T) enhancer.create();
}
}
main方法测试
public static void main(String[] args) {
LogInterceptor logInterceptor = new LogInterceptor();
UserServiceImpl service = CglibProxyUtil.createProxyObject(logInterceptor, UserServiceImpl.class);
service.update(new Object());
service.insert(new Object());
service.list();
}
/*output:
log start time [Wed Jul 06 16:20:10 CST 2022]
这里是添加用户实现
log end time [Wed Jul 06 16:20:10 CST 2022]
log start time [Wed Jul 06 16:20:10 CST 2022]
这里是添加用户实现
log end time [Wed Jul 06 16:20:10 CST 2022]
log start time [Wed Jul 06 16:20:10 CST 2022]
这里是用户列表实现
log end time [Wed Jul 06 16:20:10 CST 2022]
*/
相关链接
动态代理详解:https://juejin.cn/post/6844903744954433544
我的动态代理demo:https://gitee.com/hei_xiaoshuai/proxy