為我學(xué)習(xí) Spring AOP 準(zhǔn)備(Proxy)
Posted on 2007-10-09 11:13 G_G 閱讀(1118) 評(píng)論(2) 編輯 收藏 所屬分類: Spring為我準(zhǔn)備學(xué)習(xí)和理解spring
特留下代碼筆記:
參考:
http://dev.csdn.net/author/labile/e70c97cb7f504d35b7b5350e7810cc5a.html
代碼感想:
??? 沒個(gè)方法都或多或少需要環(huán)境參數(shù)(如: jdbc的conn ,hbn的session...等等 ),方法結(jié)束后又要關(guān)閉。
何不用proxy代理并用配置文件的方法來 關(guān),開session 等
如:以下是我的想法并不是實(shí)際可用
???
實(shí)際代碼:希望spring可以向我上面的方法配置好用來取代下面的實(shí)際代碼 ^_^
結(jié)果:
Hello World!
after method invoke!
before method invoke!
劉凱毅
after method invoke!
特留下代碼筆記:
參考:
http://dev.csdn.net/author/labile/e70c97cb7f504d35b7b5350e7810cc5a.html
代碼感想:
??? 沒個(gè)方法都或多或少需要環(huán)境參數(shù)(如: jdbc的conn ,hbn的session...等等 ),方法結(jié)束后又要關(guān)閉。
何不用proxy代理并用配置文件的方法來 關(guān),開session 等
如:以下是我的想法并不是實(shí)際可用
???
配置:
<class?name="HelloWorldImpl">
? <function?name="set*" />
? <function?name="getName">
??? <proxyBegin artt="name" value="liukaiyi"/>
??? ??? //使用Proxy來賦值 name那在實(shí)現(xiàn)代碼中就可以不用去關(guān)注象 session 等屬性的開關(guān)了
??? ??? //proxy中配置下 , 在實(shí)現(xiàn)類中 就使用 就可以了
??? <proxyBegin?ref="HelloWorldHandler.doBefter"?args="null"/>
??? <proxyEnd?ref="HelloWorldHandler.doAfter"?args="null"/>
? </function>
? <function?=?name="sayHelloWorld">
??? <proxyEnd?ref="HelloWorldHandler.doAfter"?args="null"/>
? </function>
</class>
代碼:
HelloWorld hw = (HelloWorld)Factory.getBean("HelloWorldImpl");
hw.getName();
結(jié)果是:
before method invoke!
劉凱毅
after method invoke!
在此 我只是想象,spring 還沒有看,但我認(rèn)為spring 這個(gè)著名的框架應(yīng)該在這方面有很好的實(shí)現(xiàn)。<class?name="HelloWorldImpl">
? <function?name="set*" />
? <function?name="getName">
??? <proxyBegin artt="name" value="liukaiyi"/>
??? ??? //使用Proxy來賦值 name那在實(shí)現(xiàn)代碼中就可以不用去關(guān)注象 session 等屬性的開關(guān)了
??? ??? //proxy中配置下 , 在實(shí)現(xiàn)類中 就使用 就可以了
??? <proxyBegin?ref="HelloWorldHandler.doBefter"?args="null"/>
??? <proxyEnd?ref="HelloWorldHandler.doAfter"?args="null"/>
? </function>
? <function?=?name="sayHelloWorld">
??? <proxyEnd?ref="HelloWorldHandler.doAfter"?args="null"/>
? </function>
</class>
代碼:
HelloWorld hw = (HelloWorld)Factory.getBean("HelloWorldImpl");
hw.getName();
結(jié)果是:
before method invoke!
劉凱毅
after method invoke!
實(shí)際代碼:希望spring可以向我上面的方法配置好用來取代下面的實(shí)際代碼 ^_^
package?test.proxy;
import?java.lang.reflect.InvocationHandler;
import?java.lang.reflect.Method;
import?java.lang.reflect.Proxy;
import?junit.framework.TestCase;
public?class?TestProxy?extends?TestCase?{
????
????protected?void?setUp()?throws?Exception?{
????????super.setUp();
????}
????
????public?void?testProxy(){
?????????????HelloWorld?hw?=?new?HelloWorldImpl();???????????
???????????????????????InvocationHandler?handler?=?new?HelloWorldHandler(hw);??????????
???????????????????????HelloWorld?proxy?=?(HelloWorld)?Proxy.newProxyInstance(???
?????????????????????????????????????hw.getClass().getClassLoader(),???
?????????????????????????????????????hw.getClass().getInterfaces(),???
?????????????????????????????????????handler);???
???????????????????????proxy.sayHelloWorld();
???????????????????????
???????????????????????System.out.println();
???????????????????????proxy.setName("liukaiyi");
???????????????????????proxy.getName();
????}
????
}
interface?HelloWorld?{???
????void?sayHelloWorld()?;???
????void?getName();
????void?setName(String?name);
}
class?HelloWorldImpl?implements?HelloWorld?{???
????private?String?name?=?"";
????public?void?setName(String?name)?{
????????this.name?=?name;
????}
????public?void?sayHelloWorld()?{???
????????System.out.println("Hello?World!");??????????????
????}
????public?void?getName()?{
????????System.out.println(this.name);
????}???
}
class?HelloWorldHandler?implements?InvocationHandler?{???
????????????//要代理的原始對(duì)象???
????????????private?Object?objOriginal;???
????????????/**??
?????????????*?構(gòu)造函數(shù)。??
?????????????*?@param?obj?要代理的原始對(duì)象。??
?????????????*/??
????????????public?HelloWorldHandler(Object?obj)?{???
???????????????????this.objOriginal?=?obj?;???
????????????}???
????????????public?Object?invoke(Object?proxy,?Method?method,?Object[]?args)???
??????????????????????????throws?Throwable?{???????????????
???????????????????Object?result?=?null?;??????????????
???????????????????String?meName?=?method.getName();
???????????????????if(meName.indexOf("set")>-1?){
???????????????????????return?method.invoke(this.objOriginal?,args);???
???????????????????}
???????????????????if(?meName.equals("getName")?){
????????????????????//方法調(diào)用之前???
???????????????????????????doBefore();?//仿佛是AOP的影子,呵呵???
???????????????????}
?????????????????????//調(diào)用原始對(duì)象的方法???
???????????????????????????result?=?method.invoke(this.objOriginal?,args);???
?????????????????????//方法調(diào)用之后???
???????????????????????????doAfter();???????
???????????????????
???????????????????return?result?;???
????????????}???
????????????private?void?doBefore()?{???
???????????????????System.out.println("before?method?invoke!");???
????????????}???
????????????private?void?doAfter()?{???
???????????????????System.out.println("after?method?invoke!");???
????????????}???
?????}???
import?java.lang.reflect.InvocationHandler;
import?java.lang.reflect.Method;
import?java.lang.reflect.Proxy;
import?junit.framework.TestCase;
public?class?TestProxy?extends?TestCase?{
????
????protected?void?setUp()?throws?Exception?{
????????super.setUp();
????}
????
????public?void?testProxy(){
?????????????HelloWorld?hw?=?new?HelloWorldImpl();???????????
???????????????????????InvocationHandler?handler?=?new?HelloWorldHandler(hw);??????????
???????????????????????HelloWorld?proxy?=?(HelloWorld)?Proxy.newProxyInstance(???
?????????????????????????????????????hw.getClass().getClassLoader(),???
?????????????????????????????????????hw.getClass().getInterfaces(),???
?????????????????????????????????????handler);???
???????????????????????proxy.sayHelloWorld();
???????????????????????
???????????????????????System.out.println();
???????????????????????proxy.setName("liukaiyi");
???????????????????????proxy.getName();
????}
????
}
interface?HelloWorld?{???
????void?sayHelloWorld()?;???
????void?getName();
????void?setName(String?name);
}
class?HelloWorldImpl?implements?HelloWorld?{???
????private?String?name?=?"";
????public?void?setName(String?name)?{
????????this.name?=?name;
????}
????public?void?sayHelloWorld()?{???
????????System.out.println("Hello?World!");??????????????
????}
????public?void?getName()?{
????????System.out.println(this.name);
????}???
}
class?HelloWorldHandler?implements?InvocationHandler?{???
????????????//要代理的原始對(duì)象???
????????????private?Object?objOriginal;???
????????????/**??
?????????????*?構(gòu)造函數(shù)。??
?????????????*?@param?obj?要代理的原始對(duì)象。??
?????????????*/??
????????????public?HelloWorldHandler(Object?obj)?{???
???????????????????this.objOriginal?=?obj?;???
????????????}???
????????????public?Object?invoke(Object?proxy,?Method?method,?Object[]?args)???
??????????????????????????throws?Throwable?{???????????????
???????????????????Object?result?=?null?;??????????????
???????????????????String?meName?=?method.getName();
???????????????????if(meName.indexOf("set")>-1?){
???????????????????????return?method.invoke(this.objOriginal?,args);???
???????????????????}
???????????????????if(?meName.equals("getName")?){
????????????????????//方法調(diào)用之前???
???????????????????????????doBefore();?//仿佛是AOP的影子,呵呵???
???????????????????}
?????????????????????//調(diào)用原始對(duì)象的方法???
???????????????????????????result?=?method.invoke(this.objOriginal?,args);???
?????????????????????//方法調(diào)用之后???
???????????????????????????doAfter();???????
???????????????????
???????????????????return?result?;???
????????????}???
????????????private?void?doBefore()?{???
???????????????????System.out.println("before?method?invoke!");???
????????????}???
????????????private?void?doAfter()?{???
???????????????????System.out.println("after?method?invoke!");???
????????????}???
?????}???
結(jié)果:
Hello World!
after method invoke!
before method invoke!
劉凱毅
after method invoke!