什么是代理所谓代理就是要执行的动作,请第三方代为执行。举个真实的例子,比如一个人要做手术,需要家属签字。那么在这个过程中,家属就相当于患者的代理人,家属会代表患者签字。.手术过程中,有些医生需要用到的药品也需要家属签字,家属可以选择不签字。在这个过程中,作为代理人的家属是完全可以控制的。在java中,也就是一个真正的实现类,它的行为会被它的代理类执行。代理类在执行真实类时,可以在具体方法执行前后添加一些额外的逻辑操作。比如方法执行前的初始化,或者方法执行后的清理。代理可以分为静态代理和动态代理。静态代理就是事先在java代码中写好代理类,实现代理类的逻辑。动态代理就是在代码运行过程中动态的给真实的类添加代理类。从上面的定义不难理解,静态代理是事先写好的。如果后面有功能变化,需要同步修改代理类,而动态代理是运行时动态生成的,不需要这么麻烦的操作。java中动态代理常用的实现方式有两种,一种是JDK实现的动态代理,一种是CGLIB实现的动态代理。前者以接口实现为主,后者以继承为主。本文主要研究JDK的动态代理。JDK动态代理JDK动态代理主要涉及两个类:java.lang.reflect.Proxy、java.lang.reflect.InvocationHandler。在使用过程中,会用到Proxy类中的newProxyInstance方法和InvocationHandler接口的实现。或者以接受手术的病人为例。首先,需要定义一个患者接口:/***定义一个患者接口来规范人类行为*/publicinterfacePatient{/***患者可以签名*//***处理入院*/voidtoHospital();/***出院*/voidleaveHospital();}实现一个需要手术的病人:/***一个需要手术的病人*/publicclassSurgeryPatientimplementsPatient{@Overridepublicvoidsign(){System.out.println("运行中,签名");}@OverridepublicvoidtoHospital(){System.out.println("手术前,入住");}@OverridepublicvoidleaveHospital(){System.out.println("手术后出院");}}实现患者的代理:/***实现患者的代理,为手术患者处理入院、签名、出院等。*/publicclassPatientProxyimplementsInvocationHandler{privateObjectobject;publicPatientProxy(Objecto){this.object=o;}@OverridepublicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{System.out.println("代理开始为患者执行相关动作...");Objectinvoke=method.invoke(object,args);System.out.println("Theagenthasperformedactionsforthepatient");returninvoke;}}调用逻辑:/***测试类*/publicclassApp{publicstaticvoidmain(String[]args){//首先需要一个病人进行手术PatientsurgeryPatient=newSurgeryPatient();//为这个病人创建一个代理PatientProxypatientProxy=newPatientProxy(surgeryPatient);Patientpatient=(Patient)Proxy.newProxyInstance(patientProxy.getClass().getClassLoader(),newClass[]{Patient.class},patientProxy);//处理入院patient.toHospital();//签名patient.sign();//Dischargepatient.leaveHospital();}}运行结果:agent开始为patient执行相关动作...在运行前,agent在admissionagent为patient执行完动作后为patient执行相关动作...在操作过程中,signagent为患者执行动作后,agent开始为patient执行相关动作...手术结束后,处理出院的agent为patient执行动作。通过这个例子,不难想到Spring中AOP的使用。另外,在日志和数据库连接的收集中,连接前的初始化和连接后的资源释放可以用动态代理来处理吗?
