posts - 165, comments - 198, trackbacks - 0, articles - 1
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

为我学习 Spring AOP 准备(Proxy)

Posted on 2007-10-09 11:13 G_G 阅读(1111) 评论(2)  编辑  收藏 所属分类: Spring
为我准备学习和理解spring
特留下代码笔记:
参考:
http://dev.csdn.net/author/labile/e70c97cb7f504d35b7b5350e7810cc5a.html
代码感想:
    没个方法都或多或少需要环境参数(如: 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!


评论

# re: 为我学习 Spring AOP 准备(Proxy)  回复  更多评论   

2007-10-09 12:05 by 千里冰封
呵呵,用代理还是比较好玩的

# re: 为我学习 Spring AOP 准备(Proxy)  回复  更多评论   

2008-03-13 18:14 by bless
要是很多不同的被代理类的函数返回值、里面的判断条件等等的好多种,很复杂,那invoke里岂不是要写很多判断条件,那时候怎么办啊。

只有注册用户登录后才能发表评论。


网站导航: