在代理类中引用动态代理

在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的调用,update绕过了代理,因此不会被跟踪:

一个好的解决方法是使用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/372027.shtml

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

相关文章

Array的用法总结-swift

Araay是有序的数据集&#xff0c;在OC中分为不可变数组NSArray和可变数组NSMutableArray&#xff0c;在swift中只有常量和变量两种类型&#xff0c;声明成变量那就可以说明是可变的了&#xff01; 学习时的具体的用法总结成如下的代码&#xff1a; //数组var arrInts [Int]()/…

Frame URl

http://www.zi-han.net/theme/hplus/?v4.1 http://webapplayers.com/inspinia_admin-v2.5/ http://baijunyao.com/article/67 转载于:https://www.cnblogs.com/shijiaoyun/p/6065755.html

linux的i o模型,浅谈Linux 网络 I/O 模型简介(图文)

1、介绍Linux 的内核将所有外部设备都看做一个文件来操作(一切皆文件)&#xff0c;对一个文件的读写操作会调用内核提供的系统命令&#xff0c;返回一个file descriptor(fd&#xff0c;文件描述符)。而对一个socket的读写也会有响应的描述符&#xff0c;称为socket fd(socket文…

handsontable 方法汇总

核心方法1.为handsontable添加钩子方法 addHook(key,callback):key为钩子方法名 例如&#xff1a;hot.addHook(beforeInit, myCallback); addHookOnce(key,callback)&#xff1a;添加只使用一次的方法&#xff0c;用完后自动删除 例如&#xff1a;hot.addHookOnce(beforeInit, …

swing中JTable的使用方法

1 public static void main(String[] args) {2 3 Student s1 new Student("张三", "001", 0);4 Student s2 new Student("李四", "002", 1);5 Student s3 new Student("王五", "003",…

android仿高德地图透明黑字,Android 仿高德地图可拉伸的BottomSheet

原标题&#xff1a;Android 仿高德地图可拉伸的BottomSheet2018安卓巴士开发者大会-上海站你一直期待的安卓技术盛宴即将登场&#xff01;前言最近项目中需要用到高德地图搜索结果后的结果展示的可拉伸控件。而我看到这个效果图&#xff0c;觉得这个就是一个slidingpanel&#…

Java EE 7中包含哪些JSR?

我开始填写所有应该加入Java EE 7的Java规范请求的表。 由于平台版本仍在确定中&#xff0c;因此某些细节很难确定。 完整的Java EE 7 EJB产品具有以下标准组件和API&#xff1a; 名称 版 描述 JSR 网页 轮廓 批处理 1.0 批量处理 352 Bean验证 1.1 Bean验证框…

[ Javascript ] JavaScript中的定时器(Timer) 是怎样工作的!

作为入门者来说。了解JavaScript中timer的工作方式是非常重要的。通常它们的表现行为并非那么地直观&#xff0c;而这是由于它们都处在一个单一线程中。让我们先来看一看三个用来创建以及操作timer的函数。var id setTimeout(fn, delay); - 初始化一个单一的timer&#xff0c…

android dropbox anr分析,Android如何分析排查ANR

释放双眼&#xff0c;带上耳机&#xff0c;听听看~&#xff01;在Android开发中&#xff0c;当程序发生异常时会抛出异常信息&#xff0c;先说下三种常见类型&#xff1a;列表内容KeyDispatchTimeout(谷歌default 5s&#xff0c;MTK平台上是8s) –主要类型按键或触摸事件在特定…

修改httpd默认端口号

Tomcat: vim /etc/httpd/conf/httpd.conf//别忘了service httpd restart Nginx: vim /etc/nginx/nginx.conf//完了之后service nginx restart 转载于:https://www.cnblogs.com/bincoding/p/6067054.html

整合弹簧,速度和瓷砖

我喜欢 Tiles&#xff0c; 并且听到了很多有关 Velocity的信息 。 它们似乎有不同的用途&#xff0c;并且据说很容易结合在一起&#xff0c;所以我决定试一试&#xff0c;并在Spring Web应用程序中同时使用它们。 集成实际上花费了许多小时&#xff0c;并且是一次真正的过山车&…

Android 软键盘自动弹出和关闭

在我们写修改信息或者搜索&#xff0c;修改密码等界面的时候&#xff0c;用户进入这个界面的主要目的就是输入修改/查找 某些信息&#xff0c;为了用户体验应该自动弹出软键盘而不是让用户主动点击输入框才弹出。 1.软键盘的自动弹出 private void showKeyboard(){InputMethodM…

android adb杀死服务,Android app是如何杀掉的

1. adb shell kill -9 pid_of_appAMS定义了AppDeathRecipientAPP 在 attachApplication -> attachApplicationLockedAMS里会注册 App 进程的 BinderDeath通知AppDeathRecipient adr new AppDeathRecipient(app, pid, thread);thread.asBinder().linkToDeath(adr, 0);当App进…

iOS学习笔记39-ReactiveCocoa入门

FRP&#xff0c;全称为Functional Reactive Programming&#xff0c;是一种响应变化的编程范式&#xff0c;最近几年比较火&#xff0c;大概的理解就像这样&#xff1a; 当a的值或者b的值发生变化时&#xff0c;c的值会自动响应a的值或b的值变化的信号&#xff0c;自动更正自己…

使用密码摘要生成器扩展JMeter

最近&#xff0c;我不得不处理一个带有50,000条用户记录的OpenLDAP实例&#xff0c;并进行一些压力测试。 JMeter是填充LDAP的最佳选择。 但是&#xff0c;在我的情况下&#xff0c;OpenLDAP配置为不接受任何明文密码。 因此&#xff0c;我无法使用通过JMeter LDAP Request采…

制造业数字化转型核心不止是技术

一、制造业的数字化转型意味着什么&#xff1f; 在当今的制造业领域&#xff0c;数字化转型意味着通过集成数字技术来增强传统的制造方法、产品和劳动力的过程。这些技术包括一系列创新&#xff0c;如自动化软件、电子商务系统、传感器、工业机器人等。 二、制造业数字化转型的…

分类测试以减少构建时间

在继续本文的主要内容之前&#xff0c;让我们先进行一些定义。 单元测试 单元测试是小型的&#xff08;测试一种用例或单元&#xff09;&#xff0c;在内存中运行&#xff08;不与数据库&#xff0c;消息队列等交互&#xff09;&#xff0c;可重复且快速的测试。 对于我们的对…

android横向展示状态,【报Bug】Android横屏状态下启动App,即使在App.vue中锁定竖屏,但是首页nvue中的rpx单位是按照启动的横竖屏状态显示的!...

详细问题描述(DCloud产品不会有明显的bug&#xff0c;所以你遇到的问题大都是在特定环境下才能重现的问题&#xff0c;请仔细描述你的环境和重现方式&#xff0c;否则DCloud很难排查解决你的问题)[内容]重现步骤[步骤][结果][期望]nvue首页rpx单位能够根据App.vue锁定的屏幕方向…

property修饰关键字

修饰符按作用区分&#xff1a;线程安全相关&#xff0c;内存相关&#xff0c;读写权限相关&#xff0c;set和get,是否可为空, class 一.默认值 property NSArray *dataArray; 默认的是&#xff1a;atomic&#xff0c;strong&#xff08;有的文章写的居然是assign,我认为还是str…

高精度相关模板.

1 2 /*3 高精度加法.4 */5 #include<cstring>6 #include<cstdio>7 #include<iostream>8 #define MAXN 100019 using namespace std;10 int a[MAXN],b[MAXN],c[MAXN],l1,l2,l3;11 char m[MAXN],n[MAXN];12 void slove()13 {14 l3max(l1,l2);15 for(in…