今天项目经理发下任务,需要测试 20 个接口,看看推送和接收数据是否正常。因为对接传输的数据是 xml 格式的字符串,所以我拿现成的数据,先生成推送过去的数据并存储到文本,以便验证数据是否正确,这时候要批量调用这些同名方法,我觉得这里可以发展成有潜力的代码。

推送比较好做数据,队友们都写好代码,但是有个问题,方法要的值都大致相同,封装的方式不一致,多人开发,有的封装对象里面,有的直接使用 Map.get(),唉,一千个人一千个哈姆雷特嘛,只好利用反射和动态代理节省自己的代码量,而且这种方式练练手,看上去屌屌的,我喜欢。

对接是使用基于 webService 的 cxf 跟对方的 axis2 做 SOA 对接。 这两个框架兼容性上有问题,幸好同事已经解决了。 类对应的 url 已经封装好了,写在配置文件properties 中,以传输实体类bean 为键,对方的url 为键值对。

思路
  • 要根据系统现有数据输出到文件,方便一个一个检查核对文档。
  • 它们都是实现同一接口。(Spring 实现一个及以上接口就会使用JDK动态代理,否则使用cglib)
  • 那可以判断是否实现同一个接口来拿 Service。
  • 要做这样的判断,要使用反射和动态代理调用方法。
  • 可以使用类名获取 Spring管理的类,那就可以字符串数组或集合来搞。
  • 取得代理类,强转为业务接口类再调用方法。
  • 调用方法需要形参,那就要的时候再造,而且数据大致一样,可以使用同一个成员变量。
  • 先去系统看看哪个批次数据比较充足的。
  • 声明这些公用数据。
  • 开始动手写。
接口说明:
  • 接口都继承一个顶层接口 IBaseTradingCenter( TradingCenter = 交易中心)
  • 接口分为推送 IBaseTradingCenterClient,接收为 IBaseTradingCenterServer
  • 只有一个接口方法 synch
  • 接受两个参数 Object 和 Map<String, Object>
  • Object 是给传输Bean赋值的实体,Map 作为其他值的补充
  • 没有返回值
  • 抛出异常
  • 实现该接口的类全都处于Spring 管理
做法是这样的:
  • 将这 20 个实现接口的的类的类名(例如: TenderReturnService.java),直接使用字符串数组存储,包含推送和接收(未区分,后面区分),使用字符串截取和首字符大小写处理一下。
  • 遍历数组,使用 Spring 的 WebApplicationContextUtils 获取传入字符串,获取 20 个 Service 的代理类 $Proxy0。
  • 使用 instanceof 判断代理类是否实现 IBaseTradingCenterClient(推送)接口,如果是,则用 IBaseTradingCenterClient 强制转型并存储到 List<IBaseTradingCenterClient> 中。
  • 大概获取到10个左右的推送类。(存储到List可以省略,但为代码可阅读还是不能省)
  • 遍历 List<IBaseTradingCenterClient> ,实际里面都是代理对象。
  • 需要判断代理对象的原始对象是否等同我们的业务类。
  • 查阅了一下资料,看了一下 AopUtils 源码,里面有几种方法可以使用,spring aop 有封装自己的代理模式。
  • AopUtils.isProxy() 判断是否是代理类、AopUtils.getTargetClass() 获取代理类目标对象(原始类)的 class 这两个方法我用得上。
  • AopUtils.getTargetClass() 获取原始类的 class,再跟业务类的 class 直接用 “==” 比较,为 true 原始类为该业务类。
  • 构造形参 Object 和 Map,传入代理类方法 $Proxy.synch(Object, Map)。
  • 在 Bean2XmlUtils 工具类中使用 FileUtils.writeString(str, data)写出文件。
  • 检查文件生成情况。
  • 完成。
改进

这里还有个问题需要解决:

  • 形参的问题,形参都是不一样的对象,但是使用的字段基本一样。
  • 这里我想到使用 BeanUtils 。但是这个工具类只是做对象与对象的拷贝。
  • 我可以这样想,反射得到对象的成员变量名称,用名称去一个 Map 中获取数值,如果能获取,则将 Map 中的值赋值给成员变量。那么就可以解决不同的形参对象的问题。
  • 声明一个 BeanUtils.setBeanForMap(Obj, Map)

spring aop 动态代理批量调用方法实例的更多相关文章

  1. spring AOP 动态代理和静态代理以及事务

    AOP(Aspect Oriented Programming),即面向切面编程 AOP技术,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装 ...

  2. Spring AOP动态代理原理与实现方式

    AOP:面向切面.面向方面.面向接口是一种横切技术横切技术运用:1.事务管理: (1)数据库事务:(2)编程事务(3)声明事物:Spring AOP-->声明事物   2.日志处理:3.安全验证 ...

  3. Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题

    Spring AOP底层的动态代理实现有两种方式:一种是JDK动态代理,另一种是CGLib动态代理. JDK动态代理 JDK 1.3版本以后提供了动态代理,允许开发者在运行期创建接口的代理实例,而且只 ...

  4. Spring Aop 动态代理失效分析

    1. Spring Aop 原理 Spring Aop 通过动态代理创建代理对象,在调用代理对象方法前后做增强. 2. Transactional, Async 注解失效? 当在动态代理方法中调用当前 ...

  5. Spring AOP动态代理

    出现org.springframework.aop.framework.ProxyFactoryBean cannot be cast to 错误 在类型转换的时候, 调用getObject()方法, ...

  6. Spring AOP 动态代理 缓存

    Spring AOP应用:xml配置及注解实现. 动态代理:jdk.cglib.javassist 缓存应用:高速缓存提供程序ehcache,页面缓存,session缓存 项目地址:https://g ...

  7. Spring学习笔记之aop动态代理(3)

    Spring学习笔记之aop动态代理(3) 1.0 静态代理模式的缺点: 1.在该系统中有多少的dao就的写多少的proxy,麻烦 2.如果目标接口有方法的改动,则proxy也需要改动. Person ...

  8. 死磕Spring之AOP篇 - Spring AOP自动代理(二)筛选合适的通知器

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...

  9. Spring AOP在函数接口调用性能分析及其日志处理方面的应用

    面向切面编程可以实现在不修改原来代码的情况下,增加我们所需的业务处理逻辑,比如:添加日志.本文AOP实例是基于Aspect Around注解实现的,我们需要在调用API函数的时候,统计函数调用的具体信 ...

随机推荐

  1. JavaScript中把Json字符串转化为对象

    1.采用eval()函数 定义和用法 eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码. 语法 eval(string) 参数 描述 string 必需.要计算的字符串, ...

  2. shell命令输入输出重定向

    Linux命令的执行过程 首先是输入:stdin输入可以从键盘,也可以从文件得到 命令执行完成:把成功结果输出到屏幕,stout默认是屏幕 命令执行有错误:把错误也输出到屏幕上面,stderr默认也是 ...

  3. C#三步实现标准事件处理程序

    事件,MSDN解释:类或对象可以通过事件向其他类或对象通知发生的相关事情.发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”. 有关事件的理论与好处,在这里就不再废话了,感兴趣的 ...

  4. [转载] 2 分钟读懂大数据框架 Hadoop 和 Spark 的异同

    转载自https://www.oschina.net/news/73939/hadoop-spark-%20difference 谈到大数据,相信大家对Hadoop和Apache Spark这两个名字 ...

  5. [转载] Linux五种IO模型

      转载:http://blog.csdn.net/jay900323/article/details/18141217     Linux五种IO模型性能分析   目录(?)[-] 概念理解 Lin ...

  6. Python 标准库 urllib2 的使用细节(转)

    http://www.cnblogs.com/yuxc/archive/2011/08/01/2123995.html http://blog.csdn.net/wklken/article/deta ...

  7. LKD: Chapter 9 An Introduction to Kernel Synchronization

    This chapter introduces some conception about kernel synchronization generally. Critical Regions: Co ...

  8. 十一、VueJs 填坑日记之使用Amaze ui调整列表和内容页面

    上一篇博文我们整合了Amaze ui,并且调整了一个头部header和底部footer文件,其实做起来也很简单,只要按照步骤来做,完全没有问题.今天我们来重新调整一下列表页面和内容页面,使我们做的后台 ...

  9. C#图片压缩上传

    /// <summary> /// 压缩图片 /// </summary> /// <param name="iSource">图片文件< ...

  10. c语言的内存分析

    1. 进制 1. 什么是进制 ● 是一种计数的方式,数值的表示形式  汉字:十一   十进制:11  二进制:1011  八进制:13 ● 多种进制:十进制.二进制.八进制.十六进制.也就是说,同一个 ...