服务引用代理类

在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

服务引用代理类

服务引用代理类_在代理类中引用动态代理相关推荐

  1. windbg 用代理_[Z] C#程序中设置全局代理(Global Proxy)

    https://www.cnblogs.com/Javi/p/7274268.html 1. HttpWebRequest类的Proxy属性,只要设置了该属性就能够使用代理了,如下: 1        ...

  2. 复习Object类_日期时间类_System类_StringBuilder_包装类以及各类的细节

    Object类_日期时间类_System类_StringBuilder_包装类以及各类的细节 主要内容 Object类 Date类 DateFormat类 Calendar类 System类 Stri ...

  3. Java中的动态代理详解

    前言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执 ...

  4. 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 创建 事件监听器 对应的 动态代理 | 动态代理的数据准备 | 创建调用处理程序 | 创建动态代理实例对象 )

    文章目录 前言 一.创建 事件监听器 对应的 动态代理 二.动态代理 数据准备 三.动态代理 调用处理程序 四.动态代理 实例对象创建 前言 Android 依赖注入的核心就是通过反射获取 类 / 方 ...

  5. 吃透Java中的动态代理

    动态代理在Java中是很重要的一部分,在很多框架中都会用到,如Spring中的AOP.Hadoop中的RPC等.为此在这把我对Java中的动态代理的理解分享给大家,同时写了一个模拟AOP编程的实例.( ...

  6. 深入理解JDK动态代理原理,使用javassist动手写一个动态代理框架

    文章目录 系列文章索引 一.动手实现一个动态代理框架 1.初识javassist 2.使用javassist实现一个动态代理框架 二.JDK动态代理 1.编码实现 2.基本原理 (1)getProxy ...

  7. java动态代理_Java中的动态代理一

    方法newProxyInstance介绍 这篇开始学Java中的动态代理部分,刚开始,我们不去了解什么是动态代理相关的概念,除了动态代理,还有静态代理.我们学习动态代理直接从学习一个方法开始,这个方法 ...

  8. swift 引用其他类_浅谈swift中闭包修饰符 weak?unowned? 或什么都不用

    浅谈swift中闭包修饰符 weak?unowned? 或什么都不用 平常的开发中,clourse是我们iOSr绕不过去的坎儿. 苹果本身也很重视闭包,像之前的一些老的target-action类型的 ...

  9. netcore 中的动态代理与RPC实现(微服务专题)

    一.关于RPC的调用 1. 调用者(客户端Client)以本地调用的方式发起调用: 2. Client stub(客户端存根)收到调用后,负责将被调用的方法名.参数等打包编码成特定格式的能进行网络传输 ...

  10. JAVA设计一个电视机类_漫谈Java程序设计中的接口应用

    Java语言提供了一种接口(interface)机制.这种接口机制使Java的面向对象编程变得更加灵活.我们可以用接口来定义一个类的表现形式,但接口不能包含任何实现.在<Thinking in ...

最新文章

  1. oracle表空间更改用户,ORACLE创建表空间、创建用户、更改用户默认表空间以及授权、查看权限...
  2. vim无法保存退出_180万程序员不知如何退出Vim编辑器...
  3. LeetCode-动态规划背包题-416. 分割等和子集
  4. 接口请求时params与data的区别
  5. NOIP2018没有什么新闻
  6. python矩阵运算与线形代数_[译] 线性代数:矩阵基本运算
  7. 安全中心登录_放心使用instagram需要做到的5个信息安全设置
  8. pytorch torch.nn.Embedding
  9. 2021-06-27函数定义与参数
  10. 四种优秀的数据库设计工具
  11. HDU 6319 Problem A. Ascending Rating (单调队列)
  12. access用姓名字段统计人数_access题库61-66(1)
  13. Ubuntu 16.04安装网络流量监控工具Netspeed(附带10款最佳的指示器工具)
  14. 运用Python爬虫爬取一个美女网址,爬取美女图
  15. Facebook 申请蓝色认徽章
  16. 《基于Python的大数据分析基础及实战》第一章
  17. 11_FreeRTOS时间片调度实验
  18. Bootstrap教程简介
  19. 快卫士是如何帮您保驾护航
  20. Google的云计算

热门文章

  1. sh(Spring+Spring mvc+hibernate)——BaseDao.java
  2. pythonnumpy教程_Python教程:numpy的基本介绍
  3. js解析json数组+java对象转json字符串
  4. java集合——视图与包装器
  5. final 实例域+final类+final方法(阻止继承)
  6. 利用树的先序和后序遍历打印os中的目录树
  7. java oca_OCA第2部分中的Java难题
  8. jetty java_Jetty,Java和OAuth入门
  9. layui绑定json_认识定制:JSON绑定概述系列
  10. spock测试_使用Spock测试您的代码