动态代理之cglib

来源:互联网 发布:小程序cms系统 编辑:程序博客网 时间:2024/06/05 17:12
代理技术有俩种实现方式::
* 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;}@Overridepublic 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);}}
一个测试类
@Testpublic void demo1(){StudentDao studentDao = new StudentDao();StudentDao proxy = new StudentCglibProxy(studentDao).createProxy();proxy.add();proxy.delete();proxy.modify();proxy.find();}
出结果:有图有真相