概述
JDK 动态代理,只能对实现接口的类生成代理。
Cglib可以对没有实现接口的类生成代理 ,可以拦截所有的方法
cglib用途
-AOP框架的使用,如Spring AOP和dynaop,为他们提供方法的interception(拦截)
-hibernate使用CGLIB来代理单端single-ended(多对一和一对一)关联
-EasyMock和jMock是通过使用模仿(moke)对象来测试java代码的包,而cglib可以为那些没有接口的类创建模仿对象
实例
jar包:cglib-nodep-2.2.jar
StudentDaoImpl .java
package com.dao.impl;
public class StudentDaoImpl {
public void saveStudent() {
System.out.println("正在保存");
}
public void queryStudent() {
System.out.println("正在查询");
}
}
此处展示的是不实现接口的类
DaoCglibProxy.java
package com.proxy;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class DaoCglibProxy implements MethodInterceptor{
private Object object;
/**
* 根据object对象的Class对象创建该对象的代理对象
* 1、设置父类;2、设置回调
* 本质:动态创建了一个class对象的子类
*/
public Object bind(Object object){
this.object=object;
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(object.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
private void before(){
System.out.println("before");
}
private void after(){
System.out.println("after");
}
/**
*object代理对象
*method 拦截的方法
*args方法参数
*proxy 拦截器
*/
@Override
public Object intercept(Object object, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
// TODO Auto-generated method stub
before();
proxy.invokeSuper(object, args);
after();
return null;
}
}
测试类
TestDaoCglibProxy .java
package com.proxy;
import com.dao.impl.StudentDaoImpl;
import junit.framework.TestCase;
public class TestDaoCglibProxy extends TestCase{
public void testDaoCglibProxy(){
//StudentDao studentDao=new StudentDaoImpl();
StudentDaoImpl studentDaoImpl=new StudentDaoImpl();
DaoCglibProxy proxy=new DaoCglibProxy();
studentDaoImpl=(StudentDaoImpl) proxy.bind(studentDaoImpl);
studentDaoImpl.saveStudent();
System.out.println("**********");
studentDaoImpl.queryStudent();
}
}
结果打印:
before
正在保存
after
**********
before
正在查询
after