服务引用代理类_在代理类中引用动态代理

服务引用代理类

在Stackoverflow中有一个有趣的问题 ,关于Spring Bean如何获​​得对由Spring创建的代理的引用以处理事务,Spring AOP,缓存,异步流等。需要对代理的引用,因为如果存在对自身的调用通过代理bean,此调用将完全绕过代理。

考虑一个InventoryService接口:

public interface InventoryService{public Inventory create(Inventory inventory);public List<Inventory> list();public Inventory findByVin(String vin);public Inventory update(Inventory inventory);public boolean delete(Long id);public Inventory compositeUpdateService(String vin, String newMake);
}

还请考虑该服务的默认实现,并假定最后一个方法CompositeUpdateService内部在Bean本身上调用两个方法,如下所示:

public Inventory compositeUpdateService(String vin, String newMake) {logger.info("composite Update Service called");Inventory inventory = this.findByVin(vin);inventory.setMake(newMake);this.update(inventory);return inventory;
}

如果我现在创建一个方面来建议对InventoryService的任何调用,以跟踪每个方法调用花费的时间,Spring AOP将为InventoryService Bean创建一个动态代理:

但是,对CompositeUpdateService的调用将仅在此方法的级别上记录时间,即CompositeUpdateService内部对findByVin的调用,更新绕过了代理,因此不会被跟踪:

一个好的解决方法是使用AspectJ的全部功能– AspectJ会更改DefaultInventoryService的所有方法的字节码,以包括对建议的调用。

我们制定的解决方法是将对代理本身的引用注入到bean中,而不是调用this.findByVin和this.update,而是调用proxy.findByVin和proxy.update!

因此,现在我们如何干净地将对代理的引用注入到bean中-我提供的解决方案是创建一个接口,以标记对自己的代理感兴趣的bean:

public interface ProxyAware<T> {void setProxy(T proxy);
}

感兴趣的接口及其实现如下所示:

public interface InventoryService extends ProxyAware<InventoryService>{
...
}public class DefaultInventoryService implements InventoryService{ ...private InventoryService proxy;@Overridepublic void setProxy(InventoryService proxy) {this.proxy = proxy;}
}

然后定义一个BeanPostProcessor注入这个代理!

public class ProxyInjectingBeanPostProcessor implements BeanPostProcessor, Ordered {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (AopUtils.isAopProxy((bean))){try {Object target = ((Advised)bean).getTargetSource().getTarget();if (target instanceof ProxyAware){((ProxyAware) target).setProxy(bean);}} catch (Exception e) {return bean;}}return bean;}@Overridepublic int getOrder() {return Integer.MAX_VALUE;}
}

不是最干净的实现,但是可以!

参考: http : //blog.springsource.org/2012/05/23/understanding-proxy-usage-in-spring/

参考: all和杂项博客中, JCG合作伙伴 Biju Kunjummen 引用了代理课程中的动态代理 。


翻译自: https://www.javacodegeeks.com/2012/07/reference-to-dynamic-proxy-in-proxied.html

服务引用代理类

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

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

相关文章

HTML中confirm替换,Javascript直接Confirm()函数替换

我想替换Javascript Confirm()函数以允许自定义按钮,而不是Yes / Cancel.我尝试搜索,但是所有解决方案都是事件驱动的,例如jquery对话框(其中代码不等待响应,而是事件驱动的).有谁知道非事件驱动的解决方案.它必须在Safari和IE中都可以使用(因此没有vbscript).这是系统许多部分…

关于windows防火墙关不掉解决办法

建立一个.bat文件&#xff0c;写以下内容: echo off title 正在启动防火墙服务 sc config MpsSvc startauto net start MpsSvc pause 至此完毕&#xff0c;重启试试就知道了 转载于:https://www.cnblogs.com/ciscolee/p/7616588.html

Java中特质模式的定义

在本文中&#xff0c;我将介绍特征的概念&#xff0c;并为您提供一个如何在Java中使用它们以在对象设计中减少冗余的具体示例。 我将首先提出一个虚构的案例&#xff0c;其中可以使用特征来减少重复&#xff0c;然后以使用Java 8的特征模式示例实现为结尾。 假设您正在开发留言…

计算机 注册表 远程桌面,仅允许运行使用网络级别身份验证的远程桌面计算机连接失败处理方法(远程桌面连接)...

计算机在开启远程桌面的时候选中了“仅允许运行使用网络级别身份验证的远程桌面计算机连接”&#xff0c;于是连接时提示错误如下&#xff1a;远程计算机需要网络级别身份验证&#xff0c;而您的计算机不支持该验证&#xff0c;请联系您的系统管理员或者技术人员来获得帮助解决…

前端笔记----定位

一.定位分三种&#xff1a;相对定位&#xff0c;绝对定位和固定定位。 1.相对定位&#xff1a;元素所占据的文档流的位置保留&#xff0c;元素本身相对自身原位置进行偏移&#xff1b; 如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head>&l…

html往下滑变成水平,HTML - 水平滑块CSS最佳方法_html_开发99编程知识库

由於每個部分的位置已經設置為relative&#xff0c;意味著將relative定位到上一節&#xff0c;因此可以將其他部分設置為left: 0 。* {margin: 0;}#all-sections{display:inline-flex;}.main, .about, .professional, .fun-stuff, .blog, .contact{height:100vh;position: rela…

JS高级 - 面向对象3(面向过程改写面向对象)

改写&#xff1a; 1.前提&#xff1a;所有东西都在 onload 里 2.改写&#xff1a;不能有函数嵌套&#xff0c;可以有全局变量 onload --> 构造函数 全局变量 --> 属性 函数 --> 方法 4.改错&#xff1a; thisthis啥时候会出问题&#xff1f; 1.定时器 <script>f…

mockito环境配置_Mockito –使用全局配置的SmartNull在NPE上提供更好的错误消息

mockito环境配置编写Mockito参考卡后&#xff0c;我有机会仔细研究了Mockito不太流行但非常有用的功能。 其中一些过于先进或太稀少&#xff0c;无法在refcard中进行描述&#xff0c;因此应简短说明。 其中之一就是SmartNull。 当前&#xff0c;非空方法返回适用于已知类型&…

html js清除缓存,js清除浏览器缓存的几种方法

JS 缓存的问题一直都是我们又爱又恨的东西。也是我们比较头痛的问题&#xff0c; 一方面为了提高网站响应速度,减少服务器的负担,和节省带宽&#xff0c;将需要将静态资源缓存在客户端&#xff0c; 但是另一方面&#xff0c;当js 文件有改动的时候&#xff0c;如何快速的将客户…

spring MVC 的MultipartFile转File读取

第一种方法&#xff1a; MultipartFile file xxx; CommonsMultipartFile cf (CommonsMultipartFile)file; DiskFileItem fi (DiskFileItem)cf.getFileItem(); File f fi.getStoreLocation(); 会在项目的根目录的临时文件夹下生成一个文件&#xff1b; 第二…

代理模式介绍

代表&#xff1a;被选中或当选为他人投票或代表他人的人– Merriam-Webster 。 委托模式&#xff1a;在软件工程中&#xff0c;委托模式是面向对象编程中的一种设计模式&#xff0c;其中&#xff0c;一个对象而不是执行其声明的任务之一&#xff0c;而是将该任务委托给一个关联…

江西理工大学 微型计算机原理,江西理工大学-微机原理考试(wenwei)作业.docx

江西理工大学-微机原理考试(wenwei)作业第一章1. 在计算机内部为什么要采用二进制数而不采用十进制数&#xff1f;  2. 设机器字长为6位&#xff0c;写出下列各数原码、补码和移码&#xff1a;  10101 11111 10000 ?-10101 -11111 -10000  3. 利用补码进行加/减法运算比…

C语言中数组做函数参数的问题

数组做函数参数&#xff0c;会退化成为一个指针变量。因此在进行数组参数传递的同时&#xff0c;需要传递一个数组长度的参数变量。 数组长度可以通过sizeof(arr)/siezof(arr[0])来得到。关于这个sizeof操作符&#xff0c;简单的理解就是求得指针指向的内存块的大小。 当数组作…

计算机图形标定学,计算机图形学(璩柏青)第10章空间形体的三维重建与图像处理.ppt...

计算机图形学(璩柏青)第10章空间形体的三维重建与图像处理相应可得到各单元方程组集&#xff0c; 即总体方程为 整个SFS问题求解是一个逐次线性化过程&#xff0c;可按如下步骤实现&#xff1a; (1) 先给定一定的初值R(p,q)&#xff1b; (2) 局部线性化反射图函数&#xff…

线程并发库和线程池的作用_并发–顺序线程和原始线程

线程并发库和线程池的作用不久前&#xff0c;我参与了一个项目&#xff0c;该项目的报告流程如下&#xff1a; 用户会要求举报 报告要求将被翻译成较小的部分 基于零件/节的类型的每个零件的报告将由报告生成器生成 组成报告的各个部分将重新组合成最终报告&#xff0c;并返…

ipad2018编写html,IT教程:ipad6是ipad2018吗

科技就如同电灯发出的光一样&#xff0c;点亮我们的世界&#xff0c;点亮我们的生活&#xff0c;这一段时间以来ipad6是ipad2018吗的消息络绎不绝是什么原因呢?接下来就让我们一起了解一下吧。大家好&#xff0c;我是智能客服时间君&#xff0c;上述问题将由我为大家进行解答。…

Web工程师修行笔记_必备单词(第三部)

历经千辛万苦&#xff0c;整理了软件开发过程中必备英文单词&#xff0c;助你走向编程巅峰 !!! 连最难的英文单词你都征服了&#xff0c;你还怕什么&#xff1f; (拒绝死记硬背&#xff0c;平时多看看&#xff0c;多用于代码中&#xff0c;&#xff09; 【不求全部都会&#xf…

流的多层次分组

1.简介 使用Java 8流&#xff0c;可以很容易地根据不同的标准对对象集合进行分组。 在这篇文章中&#xff0c;我们将看到如何从简单的单级分组到更复杂的&#xff0c;涉及多个级分组的分组。 我们将使用两个类来表示我们要分组的对象&#xff1a;人和宠物。 人类 public cla…

华为微型计算机b515,华为MateStation B515台式机曝光:五种配置

之前华为官网曾上架了台式机MateStation B515&#xff0c;这引起了很多网友的关注&#xff0c;不过实际情况是&#xff0c;它只是针对政企渠道&#xff0c;不过官方当时并没有给出新品的售价。从网友最新曝光的细节看&#xff0c;MateStation B515要比之前传闻的价格便宜不少&a…

冈仁波齐

昨日看了《冈仁波齐》&#xff0c;其实第一次听这部电影还是在网易云看到朴树的新歌《No Fear In My Heart》时知道有这样一部电影的&#xff1b; 抱着好奇心去看&#xff0c;发现这确实是一部不错的电影&#xff0c;具体好在哪里我也不是说得很清楚&#xff0c;只知道我在看电…