1.JDK动态代理
注意:JDK动态代理只能对实现了接口的类产生代理。
1.提供接口
package com.icbc.study.dao;
public interface UserDao {
public void save();
}
2.实现类
public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("持久层:用户保存");
}
}
- 代理类及测试。
注:CustomerDaoImpl是没有接口的一个类
package com.icbc.study.test;
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
public class CglibProxy implements MethodInterceptor {
// 要代理的对象
private CustomerDaoImpl customerDaoImpl;
public CglibProxy(CustomerDaoImpl customerDaoImpl) {
super();
this.customerDaoImpl = customerDaoImpl;
}
public CustomerDaoImpl creatProxy() {
// 创建Cglib核心类
Enhancer enhancer = new Enhancer();
// 设置父类
enhancer.setSuperclass(CustomerDaoImpl.class);
// 设置回调
enhancer.setCallback(this);
// 生成代理
CustomerDaoImpl proxy = (CustomerDaoImpl) enhancer.create();
return proxy;
}
@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
System.out.println("日志记录");
Object object = arg3.invokeSuper(arg0, arg2);
return object;
}
public static void main(String[] args) {
CustomerDaoImpl customerDaoImpl2 = new CustomerDaoImpl();
CglibProxy cglibProxy = new CglibProxy(customerDaoImpl2);
CustomerDaoImpl customerDaoImpl3 = cglibProxy.creatProxy();
customerDaoImpl3.save();
}