JDK动态代理只能适用于接口。CGLIB适用于类。
首先是类:ProductDao
package com.imooc.aop.demo2;
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代理的类:MyCglibProxy
package com.imooc.aop.demo2;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
//实现MethodInterceptor
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);
//4.生成代理
Object proxy = enhancer.create();
return proxy;
}
//实现MethodInterceptor的方法,类似于JDK代理的invoke方法。四个参数:代理对象,执行方法,方法参数,方法代理
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);
}
}
测试代码:
package com.imooc.aop.demo2;
import org.junit.Test;
public class SpringDemo2 {
@Test
public void demo1(){
ProductDao productDao = new ProductDao();
ProductDao proxy = (ProductDao)new MyCglibProxy(productDao).createProxy();
proxy.delete();
proxy.find();
proxy.save();
proxy.update();
}
}
你会看到,在save方法执行之前,执行了增强。
需要提到的一点时,使用CGLIB,只需要引入Spring的5几个jar包,连配置文件都不需要配置。