博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringAPI手动创建代理对象——ProxyFactory
阅读量:6247 次
发布时间:2019-06-22

本文共 3648 字,大约阅读时间需要 12 分钟。

hot3.png

可以通过注解的方式来自定义代理对象的创建,同时也可以通过SpringAPI,手动编程的方式来创建代理对象。

几个重要的API:

ProxyFactory\MethodInterceptor\Advice\AfterReturningAdvice\MethodBeforeAdvice

直接粘贴代码,代码能说明一切大笑


/**

*
*/
package cn.hessian.proxy;

import java.lang.reflect.Method;

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;

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
北京生活圈

转载于:https://my.oschina.net/hotbain/blog/119420

你可能感兴趣的文章
python ----字符串基础练习题30道
查看>>
K 班1-7,alpha,beta 作业成绩汇总
查看>>
uva-10879-因数分解
查看>>
清空表且自增的id重新从0开始
查看>>
[杂记]如何在LaTeX里插入高亮代码
查看>>
「常微分方程」(阿諾爾德) Page 6 問題4 經過擴張相空間的每一點有且僅有一條積分曲線...
查看>>
同一个闭区间上有界变差函数的和与积都是有界变差函数
查看>>
java安全证书配置
查看>>
使用erlang 建立一个自动化的灌溉系统(1)准备工作
查看>>
python 调用aiohttp
查看>>
mysql 案例~ mysql故障恢复
查看>>
Spring Boot中使用MyBatis注解配置详解
查看>>
MatLab实现FFT与功率谱
查看>>
答《漫话ID》中的疑问:UniqueID和ClientID的来源
查看>>
【转】Asp.net控件开发学习笔记整理篇 - 服务器控件生命周期
查看>>
Linux下的shell编程(一)BY 四喜三顺
查看>>
javascript一些小技巧
查看>>
I00024 出钱买羽
查看>>
linux下文件的一些文件颜色的含义
查看>>
websotrm注册码
查看>>