轻松掌握Java代理模式
和大家一起聊一聊java代理模式
1、静态代理
1.1静态代理的代理类和和被代理的类都要维护一个共同的接口。
publicinterfaceIUserDao{ voidsave(); }
1.2被代理的类,目标对象
publicclassUserDaoimplementsIUserDao{ @Override publicvoidsave(){ System.out.println("-----已经保存数据!!!------"); } }
1.3代理对象
publicclassUserDaoProxyimplementsIUserDao{ //接收保存目标对象 privateIUserDaotarget; publicUserDaoProxy(IUserDaotarget){ this.target=target; } @Override publicvoidsave(){ System.out.println("开始事务..."); target.save();//执行目标对象的方法 System.out.println("提交事务..."); } }
1.4测试类
publicclassApp{ publicstaticvoidmain(String[]args){ //目标对象 IUserDaotarget=newUserDao(); //代理 IUserDaoproxy=newUserDaoProxy(target); proxy.save();//执行的是,代理的方法 } }
2、动态代理
2.1同样的,动态代理也需要完成一个接口。(同上)
2.2目标对象也是相同的。
2.3只是在代理对象上有所不同
publicclassProxyFactory{ //维护一个目标对象 privateObjecttarget; publicProxyFactory(Objecttarget){ this.target=target; } //给目标对象,生成代理对象 publicObjectgetProxyInstance(){ returnProxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), newInvocationHandler(){ @Override publicObjectinvoke(Objectproxy,Methodmethod,Object[]args) throwsThrowable{ System.out.println("开启事务"); //执行目标对象方法 ObjectreturnValue=method.invoke(target,args); System.out.println("提交事务"); returnreturnValue; } }); } }
2.4测试类
publicclassApp{ publicstaticvoidmain(String[]args){ //目标对象 IUserDaotarget=newUserDao(); System.out.println(target.getClass()); //给目标对象,创建代理对象 IUserDaoproxy=(IUserDao)newProxyFactory(target).getProxyInstance(); System.out.println(proxy.getClass()); //执行方法【代理对象】 proxy.save(); } }
3、cglib代理
3.1cglib代理不需要完成接口,只需要写被代理的类和代理类即可,此处被代理类同1.2,所以不再编写。
3.2代理类有所不同,用到cglib代理模式需要引用spring的核心框架包。
publicclassProxyFactoryimplementsMethodInterceptor{ //维护目标对象 privateObjecttarget; publicProxyFactory(Objecttarget){ this.target=target; } //给目标对象创建代理对象 publicObjectgetProxyInstance(){ //1.工具类 Enhanceren=newEnhancer(); //2.设置父类 en.setSuperclass(target.getClass()); //3.设置回调函数 en.setCallback(this); //4.创建子类(代理对象) returnen.create(); } @Override publicObjectintercept(Objectobj,Methodmethod,Object[]args, MethodProxyproxy)throwsThrowable{ System.out.println("开始事务....."); //执行目标对象的方法 ObjectreturnValue=method.invoke(target,args); System.out.println("提交事务....."); returnreturnValue; } }
3.3测试类
publicclassApp{ publicstaticvoidmain(String[]args){ //目标对象 UserDaotarget=newUserDao(); System.out.println(target.getClass()); //代理对象 UserDaoproxy=(UserDao)newProxyFactory(target).getProxyInstance(); System.out.println(proxy.getClass()); //执行代理对象的方法 proxy.save(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。