代理技术有俩种实现方式::
* JDK的动态代理 :针对实现了接口的类产生代理.
* Cglib的动态代理 :针对没有实现接口的类产生代理.产生了这个类的一个子类对象.不要使用final修改这个类.
这篇文章说一下Cglib方式的动态代理
直接上例子:
一个类
public class StudentDao {
public void add(){
System.out.println("我是添加方法。。。。。。。。");
}
public void delete(){
System.out.println("我是删除方法。。。。。。。。");
}
public void modify(){
System.out.println("我是修改方法。。。。。。。。");
}
public void find(){
System.out.println("我是查询方法。。。。。。。。");
}
}
一个Cglib代理类
public class StudentCglibProxy implements MethodInterceptor {
private StudentDao studentDao;
public StudentCglibProxy(StudentDao studentDao){
this.studentDao = studentDao;
}
/**
* 创建代理对象
*/
public StudentDao createProxy(){
// 创建Cglib的核心类:
Enhancer enhancer = new Enhancer();
// 设置父类:
enhancer.setSuperclass(StudentDao.class);
// 设置回调:
enhancer.setCallback(this);
// 生成代理:
StudentDao studentProxy = (StudentDao) enhancer.create();
return studentProxy;
}
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
//判断方法
if("delete".equals(method.getName())){
System.out.println("使用Cglib的方式增强了删除方法");
return methodProxy.invokeSuper(proxy, args);
}
return methodProxy.invokeSuper(proxy, args);
}
}
一个测试类
@Test
public void demo1(){
StudentDao studentDao = new StudentDao();
StudentDao proxy = new StudentCglibProxy(studentDao).createProxy();
proxy.add();
proxy.delete();
proxy.modify();
proxy.find();
}
出结果:有图有真相