欢迎来到天天文库
浏览记录
ID:37776305
大小:339.50 KB
页数:14页
时间:2019-05-30
《springAOP代理机制》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、CONFIDENTIALSpringAOP入门--代理机制www.ascenttech.com.cn中国北京:电话:(010)82780848/62969799地址:北京市海淀区创业中路36号留学人员创业园306室目标什么是AOP代理机制静态代理动态代理AOP的几个基本概念AOPAOPAspectOrientedProgramming的缩写,意思是面向方面编程。AOP实际是GoF设计模式的延续,设计模式孜孜不倦所追求的就是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。Aspect是程序设计一个新的中
2、心,AOP並不取代OOP,两者各有各的角色,将职责各自分配给Object与Aspect,会使得程序中各个组件的角色更为清楚。代理机制静态代理代理对象HelloProxy将代理真正的HelloSpeaker实现类来执行hello()等方法,並在其前后加上日志记录的动作,这使得我们的HelloSpeaker在执行业务方法时不必介入日志记录动作,可以专心于自己的职责。注意:代理对象的一个接口只服务于一种类的对象,而且如果要代理的方法很多,我们势必要为每个方法进行代理,静态代理在程序規模稍大時就必定无法胜任.代理机制JDK动
3、态代理Java在JDK1.3之后加入协助开发动态代理功能的类,我們不必为特定对象与方法写特定的代理,使用动态代理,可以使得一个handler服务于各个对象,首先,一個handler必须实现java.lang.reflect.InvocationHandler代理机制JDK动态代理importjava.lang.reflect.*;publicclassLogHandlerimplementsInvocationHandler{//privateObjecttargetObject;//被代理的对象publicObje
4、ctcreateProxy(ObjecttargetObject){//传入被代理的对象this.targetObject=targetObject;returnProxy.newProxyInstance(targetObject.getClass().getClassLoader(),targetObject.getClass().getInterfaces(),this);//this通过被代理的对象生成它的代理对象,并同handler绑定在一起}代理机制JDK动态代理publicObjectinvoke(Ob
5、jectproxy,Methodmethod,Object[]args)throwsThrowable{Objectresult=null;try{System.out.println("begin");//日志记录result=method.invoke(targetObject,args);//!!!!!!!!调用被代理对象的方法System.out.println("ok,end");//日志记录}catch(Exceptione){e.printStackTrace();}returnresult;}}Inv
6、ocationHandler的invoke()方法会传入代理对象的方法名称与参数,实际上要执行的方法交由method.invoke(),並在其前后加上记录动作,method.invoke()返回的对象是实际方法执行过后的回传結果。代理机制JDK动态代理必須有接口:publicinterfaceIHello{publicvoidhello(Stringname);}实现该接口:publicclassHelloSpeakerimplementsIHello{publicvoidhello(Stringname){Syst
7、em.out.println("Hello,"+name);}}执行:加日志(利用代理类):LogHandlerlogHandler=newLogHandler();IHellohelloProxy=(IHello)logHandler.createProxy(newHelloSpeaker());//传入被代理对象,传回代理对象helloProxy.hello(“焦学理");//->logHandler.invoke()->helloSpeaker.hello()执行:不加日志(不利用代理类):IHelloh=ne
8、wHelloSpeaker();h.hello("焦学理");代理机制JDK动态代理LogHandler不再服务于特定对象与接口,而HelloSpeaker也不用插入任何有关于日志记录的动作,它不用意识到日志记录动作的存在。上面例子中,如果HelloSpeaker本身插入日志记录动作,这使得HelloSpeaker的职责加重,並混淆其原來的角色
此文档下载收益归作者所有