SpringAPI手動建立代理對象——ProxyFactory

能夠經過註解的方式來自定義代理對象的建立,同時也能夠經過SpringAPI,手動編程的方式來建立代理對象。java

幾個重要的API:spring

ProxyFactory\MethodInterceptor\Advice\AfterReturningAdvice\MethodBeforeAdvice編程

直接粘貼代碼,代碼能說明一切大笑ide


/**
*
*/
package cn.hessian.proxy;ui

import java.lang.reflect.Method;this

import org.aopalliance.intercept.Interceptor;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.junit.Test;
import org.springframework.aop.AfterAdvice;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.aop.framework.ProxyFactory;.net

import cn.hessian.service.HelloWorldService;
import cn.hessian.service.impl.HelloWorldServiceImpl2;代理

/**
* @author beijing
* 2013-4-2
*/
public class SpringProgramicProxyDemo {對象

    @Test
    public void test(){
        //代理對象須要的實現的接口
        Class[] interfaces=new Class[]{HelloWorldService.class};
        //利用spring的API,建立代理工廠
        ProxyFactory proxyFactory=new ProxyFactory(interfaces);
        //設置目標對象
        proxyFactory.setTarget(new HelloWorldServiceImpl2());
        /**
         * Set whether proxies created by this configuration should be prevented from being cast to Advised to query proxy status.
            Default is "false", meaning that any AOP proxy can be cast to Advised.
         * */
        proxyFactory.setOpaque(true);
       //添加方法前置通知
        proxyFactory.addAdvice(new MethodBeforeAdvice() {
            @Override
            public void before(Method method, Object[] args, Object target)
                    throws Throwable {
                System.out.println("1111111111在方法調用以前攔截");
            }
        });
        //能夠添加多個方法前置或者後置通知
    proxyFactory.addAdvice(new MethodBeforeAdvice() {
           
            @Override
            public void before(Method method, Object[] args, Object target)
                    throws Throwable {
                System.out.println("22222222在方法調用以前攔截");
            }
        });
   //能夠添加多個方法前置或者後置通知
        proxyFactory.addAdvice(new AfterReturningAdvice() {
           
            @Override
            public void afterReturning(Object returnValue, Method method,
                    Object[] args, Object target) throws Throwable {
                System.out.println("方法完成以後調用的方法11111");
               
            }
        });
       
       //能夠添加多個方法前置或者後置通知
        proxyFactory.addAdvice(new AfterReturningAdvice() {
           
            @Override
            public void afterReturning(Object returnValue, Method method,
                    Object[] args, Object target) throws Throwable {
                System.out.println("方法完成以後調用的方法22222");
               
            }
        });
      接口

  //對於環繞通知只能添加一個,多添加也是沒有用的,spring會選第一個advice,請看結果

        proxyFactory.addAdvice(new MethodInterceptor() {
           
            @Override
            public Object invoke(MethodInvocation invocation) throws Throwable {
                System.out.println("1111111環繞通知");
                Object[] params=invocation.getArguments();
                Method method=invocation.getMethod();
                Object target=invocation.getThis();
                Object bytes=method.invoke(target, params);
                byte[] result=(byte[]) bytes;
                System.out.println("1111111111環繞通知生成的結果--"+new String(result));
                return "北京生活圈".getBytes();
            }
        });
       
       //對於環繞通知只能添加一個,多添加也是沒有用的,spring會選第一個advice,請看結果
proxyFactory.addAdvice(new MethodInterceptor() {
           
            @Override
            public Object invoke(MethodInvocation invocation) throws Throwable {
                System.out.println("22222環繞通知");
                Object[] params=invocation.getArguments();
                Method method=invocation.getMethod();
                Object target=invocation.getThis();
                Object bytes=method.invoke(target, params);
                byte[] result=(byte[]) bytes;
                System.out.println("222222環繞通知生成的結果--"+new String(result));
                return bytes;
            }
        });
       
       
        Object proxy=proxyFactory.getProxy(proxyFactory.getClass().getClassLoader());
       
        Class[] inters=proxy.getClass().getInterfaces();
        for(Class str: inters ){
            System.out.println(str.getSimpleName());
        }
       
        HelloWorldService helloWorldService=(HelloWorldService)proxy;
        System.out.println(new String(helloWorldService.sayHelloWorld("北京")));
    }
}

 



生成的結果爲大笑:

HelloWorldService
SpringProxy
1111111111在方法調用以前攔截
22222222在方法調用以前攔截
1111111環繞通知
1111111111環繞通知生成的結果--你好 北京
方法完成以後調用的方法22222
方法完成以後調用的方法11111
北京生活圈

Penguins

相關文章
相關標籤/搜索