因为jdk的动态代理只能对实现了接口的类去产生代理。如果要产生代理的类没有实现接口,则jdk的动态代理就无法使用。CGLIB代理的原理是生成了一个类来继承目标类。使用CGLIB代理需要添加CGLIB的包,如果添加了spring的依赖就不需要添加了,因为spring的四个核心包包含了CGLIB。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
一、要被代理的类:
//实体类
public class ProductDao {
public void save(){
System.out.println("保存商品");
}
public void update(){
System.out.println("修改商品");
}
public void delete(){
System.out.println("删除商品");
}
public void find(){
System.out.println("查询商品");
}
}
二、 Cglib代理类:
public class MyCGlibProxy implements MethodInterceptor {
private ProductDao productDao;
public MyCGlibProxy(ProductDao productDao){
this.productDao = productDao;
}
public Object createProxy(){
//1.创建核心类
Enhancer enhancer = new Enhancer();
//2.设置父类
enhancer.setSuperclass(productDao.getClass());
//3.设置回调
enhancer.setCallback(this);//setCallback方法需要传递一个实现了MethodInterceptro接口的实现了,因为本来实现了该方法,所以填this.
//4.生成代理
Object proxy = enhancer.create();
return proxy;
}
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
//如果匹配到方法,就先增强
if("save".equals(method.getName())){
System.out.println("权限校验");
return methodProxy.invokeSuper(proxy,args);
}
//调用原封不动的代码
return methodProxy.invokeSuper(proxy,args);
}
}
三、测试类:
//测试类代码
public class SpringDemo2 {
@Test
public void demo1(){
ProductDao productDao = new ProductDao();
ProductDao proxy = (ProductDao) new MyCGlibProxy(productDao).createProxy();
proxy.save();
proxy.update();
proxy.delete();
proxy.find();
}
}
四、运行结果:
//运行结果
权限校验
保存商品
修改商品
删除商品
查询商品
五、cglib代理类需要实现的MethodInterceptor接口:
package org.springframework.cglib.proxy;
import java.lang.reflect.Method;
public interface MethodInterceptor extends Callback {
Object intercept(Object var1, Method var2, Object[] var3, MethodProxy var4) throws Throwable;
}
总结:使用cglib来产生代理首先需要加入cglib的类库,然后代理类必须要实现MethodInterceptor接口,重写intercept接口。