为我学习 Spring AOP 准备(Proxy)

为我准备学习和理解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!

你可能感兴趣的:(为我学习 Spring AOP 准备(Proxy))