SpringAPI手动创建代理对象——ProxyFactory

2019独角兽企业重金招聘Python工程师标准>>> 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
北京生活圈

Penguins

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402874.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于Pac-Man,你所要了解的 一切

2019独角兽企业重金招聘Python工程师标准>>> 不论何时,它一直都是最伟大的游戏之一。这里有许多有关它的有趣的内幕:Pac-Man。 第一, 在一天之内重新创建Pac-Man 。 第二,对游戏种的每个鬼背后的人工智能的 一个非常详细的探讨 。 事实证明…

grunt入门 出处:http://artwl.cnblogs.com

grunt-contrib-uglify uglify是一个文件压缩插件,项目地址:https://github.com/gruntjs/grunt-contrib-uglify 本文将以一个DEMO来展示如何使用uglify插件。 DEMO环境 package.json: {"name": "grunt-demo","version": &q…

探讨NDK编译错误ld.exe: Dwarf Error: mangled line number section.

如题所示的NDK编译错误是什么原因导致的?我的困惑今天在把WIN32下的一个工程移植到ANDROID时遇到上述错误,感到非常困惑。错误如下:D:/ndkr8/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi…

Visual Studio Code之常备快捷键

From: https://blog.csdn.net/u010019717/article/details/50443970 孙广东 2015.12.31 官方快捷键大全:https://code.visualstudio.com/docs/customization/keybindings Visual Studio Code是个牛逼的编辑器,启动非常快,完全可以用来代替其…

jquery中cookie用法实例详解(获取,存储,删除等)

这篇文章主要介绍了jquery中cookie用法,结合实例详细分析了jQuery操作cookie的获取,存储,删除等操作,并附带了Jquery操作Cookie记录用户查询过信息实现方法,需要的朋友可以参考下本文实例讲述了jquery中cookie用法。分享给大家供大家参考,具体如下: cook…

通过挂载系统光盘搭建本地yum仓库的方法

1、配置本地yum源(挂载光盘) mkdir /medir/cdrom(创建目录) mount /dev/cdrom / medir/cdrom (挂载到/ medir/cdrom目录) 2、修改yum配置文件 3. 修改挂载路径/ medir/cdrom, 将gpgcheck1改为0 enabled0改为1. 4. yum list …

谷歌划词翻译

谷歌划词翻译是个谷歌插件 复制及时翻译很好用 插件下载地址 配置谷歌翻译方法

教你如何在linux 下批量卸载

教你如何在linux 下批量卸载 最 近本来想在linux 下配置 JDK 6.0 用来开发java,然后遇到很多麻烦,一开始的时候屁颠屁颠的到SUN的网站去下载个 JRE 的bin 文件,这个文件比较小,几十MB而已,安装的时候它自动安装在 /usr…

vue项目启动成功浏览器不显示

场景:vue项目启动成功,无任何报错,但是浏览器却一直加载,页面始终是空白。 如果你的项目用到了element-ui的标签页组件el-tabs组件,那么大概率是此组件引起的浏览器卡死问题。 可以现将el-tabs的代码注释掉&#xff0c…

几种常用的清除浮动方法(一)

From: https://www.cnblogs.com/nxl0908/p/7245460.html 1、父级div定义伪类&#xff1a;after和zoom <style type"text/css"> .div1{background:#000080;border:1px solid red;}.div2{background:#800080;border:1px solid red;height:100px;margin-top:10px…

h5下载静态文件

1.需要将文件放src的下面的static的文件夹内 2.如果下载的是浏览器不能识别的&#xff08;例如&#xff1a;.exe,.zip,.doc等&#xff09;内容&#xff0c;浏览器会直接进行下载&#xff0c;但是如果下载的是浏览器可以识别的&#xff08;例如&#xff1a;.png,.jpg等&#xff…

浮动的清除 -- 四种方法

From: https://www.cnblogs.com/gchlcc/p/5824200.html 前言 -- 一个父亲不能被自己浮动的儿子&#xff0c;撑出高度。 开胃小菜 来看一个实验&#xff1a;现在有两个div&#xff0c;div身上没有任何属性。每个div中都有li&#xff0c;这些li都是浮动的。我们本以为这些li&a…

eq相等,smarty 比较操作符!时间戳

2019独角兽企业重金招聘Python工程师标准>>> eq相等&#xff0c; ne、neq不相等&#xff0c; gt大于&#xff0c; lt小于&#xff0c; gte、ge大于等于&#xff0c; lte、le 小于等于&#xff0c; not非&#xff0c; mod求模。 is [not] div by是否能被某数整除&am…

html页面通过特殊链接:打电话,发短信,发邮件详细教程

From: http://www.cnblogs.com/liuhongfeng/p/4976599.html 采用url href链接的方式&#xff0c;实现在Safari ios&#xff0c;Android 浏览器&#xff0c;webos浏览器&#xff0c;塞班浏览器&#xff0c;IE&#xff0c;Operamini等主流浏览器&#xff0c;进行拨打电话功能。…

Photoshop切图学习

前端开发中&#xff0c;之前都是Designer给我们切好图&#xff0c;给出readline&#xff0c;所以我们前端工程师基本不自己动手切图&#xff0c;现在换了新的公司&#xff0c;需要我们自己手动切一些图。Designer制作好的psd的图片如下&#xff1a; 自己想达到以下要求&#xf…

微信小程序开发demo-地图定位

要求要完成的功能&#xff1a; 1.要完成的要点是城市定位。 2.就是切换城市。 首页我们先参照微信小程序开放的官方文档找到&#xff1a; 在这里我们可以找到”当前位置经纬度“ getLocation: function (){var that this wx.getLocation({success: function (res) {console.lo…

移动端H5下载后端文件

首先是手机H5移动端上&#xff0c;针对能直接打开的文件例如pdf等&#xff0c;下载是直接打开预览了。如果要真正保存到手机里&#xff0c;需要点击右上角三个点去那里面选择保存。对于非预览文件会直接下载。 而在有些浏览器里&#xff0c;是可以直接下载出文件的。感觉这个与…

[CSS] 眼下最流行的五大CSS框架,你都知道么?

From: http://developer.51cto.com/art/201710/555733.htm 如今&#xff0c;CSS框架越来越受欢迎&#xff0c;可以说已经应用到每一个网站上了。作为开发工具&#xff0c;CSS框架一直处于不断进化和改进的状态&#xff0c;因此我们强烈建议您关注眼下的趋势。这篇文章会带您了…

前端复制字符串到excel生成表格

场景需求&#xff1a;前端页面有个按钮&#xff0c;点击时候会复制一段文本&#xff0c;然后将复制的文本直接copy黏贴到excel表格里&#xff0c;就会自动形成对应的表格数据。 以下代码可以直接复制使用&#xff08;有效的点赞支持一波&#xff09;&#xff1a; copyAll () {…

[QUICK UI] 有哪些目前流行的前端框架

From: https://blog.csdn.net/qianduankuangjia/article/details/78185047 使用前端框架其实和开发的项目有一定的关系&#xff0c;因为在不同的项目中可能会用到不同的组件功能&#xff0c;这样说可能有一点片面&#xff0c;但是在面临几十种再做出选择的时候确实有一定的难度…