技术开发 频道

为我学习 Spring AOP 准备(Proxy)

【IT168技术文档】没个方法都或多或少需要环境参数(如: jdbc的conn ,hbn的session...等等 ),方法结束后又要关闭。
何不用proxy代理并用配置文件的方法来 关,开session 等
如:以下是我的想法并不是实际可用
配置: <class name="HelloWorldImpl"> <function name="set*" /> <function name="getName"> <proxyBegin artt="name" value="liukaiyi"/> //使用Proxy来赋值 name那在实现代码中就可以不用去关注象 session 等属性的开关了 //proxy中配置下 , 在实现类中 就使用 就可以了 <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(); 结果是: before method invoke! 刘凯毅 after method invoke!
在此 我只是想象,spring 还没有看,但我认为spring 这个著名的框架应该在这方面有很好的实现。希望spring可以向我上面的方法配置好用来取代下面的实际代码 ^_^
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 { //要代理的原始对象 private Object objOriginal; /** * 构造函数。 * @param obj 要代理的原始对象。 */ 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") ){ //方法调用之前 doBefore(); //仿佛是AOP的影子,呵呵 } //调用原始对象的方法 result = method.invoke(this.objOriginal ,args); //方法调用之后 doAfter(); return result ; } private void doBefore() { System.out.println("before method invoke!"); } private void doAfter() { System.out.println("after method invoke!"); } }
结果:
Hello World!
after method invoke!

before method invoke!
刘凯毅
after method invoke!
原文地址
0
相关文章