1. Static Proxy
Abstract topic: Subject
Public Interface Subject { public String Add ();}
Target object: Resubject
Public class Resubject implements Subject { public String Add () { System. out. println ("ok! " ); return "" ; }}
Proxy object: Psubject
Public classPsubject implements Subject {PrivateSubject Resubject; PublicSubject Getresubject () {returnResubject; } Public voidSetresubject (Subject resubject) { This. Resubject =Resubject; } PublicString Add () {System. out. println ("Open it! "); returnResubject.add (); }}
One side
// Static proxy @Test publicvoid test12 () { Subject Subject=new Resubject (); Psubject psubject=new psubject (); Psubject.setresubject (subject); Psubject.add (); }
2. Dynamic Agent
Interface
Public Interface Iuserdao { public String Add (); Public String edit ();}
Class
Public classUserdaoimpl implements iuserdao{ PublicString Add () {System. out. println ("Add"); return "Add"; } PublicString edit () {System. out. println ("Edit"); return "Edit"; }}
One side
//Dynamic Agent@Test Public voidtest13 () {final Iuserdao dao=NewUserdaoimpl (); Iuserdao pp= (Iuserdao) proxy.newproxyinstance (Dao.getclass (). getClassLoader (), Dao.getclass (). Getinterfaces (),NewInvocationhandler () { Publicobject Invoke (Object proxy, Method method, object[] args) throws Throwable {System. out. println ("Open"); Method.invoke (Dao,args); return NULL; } }); Pp.add (); Pp.edit (); }
3.cglib Dynamic Agent
Public class UserService { publicvoid Delete () { System. out. println ("OK");} }
One side (two ways)
/*cglib Dynamic Agent*/@Test Public voidtest14 () {Final UserService servive=NewUserService (); Enhancer Enhancer=Newenhancer (); Enhancer.setsuperclass (Servive.getclass ()); Enhancer.setcallback (NewMethodinterceptor () { PublicObject Intercept (Object o, Method, object[] objects, Methodproxy methodproxy) throws Throwable { System. out. println ("Open"); Methodproxy.invoke (servive,objects); return NULL; } }); /*Enhancer.setcallback (New Org.springframework.cglib.proxy.InvocationHandler () {public object Invoke (object O, method, object[] objects) throws Throwable {System.out.println ("open"); Method.invoke (servive,objects); return null; } });*/userservice AA=(UserService) enhancer.create (); Aa.delete (); }
Spring Proxy mode