今天项目经理发下任务,需要测试 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. Strategic Game

    Strategic Game Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...

  2. AngularJS学习篇(八)

    AngularJS 服务(Service) 在 AngularJS 中,服务是一个函数或对象,可在你的 AngularJS 应用中使用. AngularJS 内建了30 多个服务. 为什么使用服务? ...

  3. ③bootstrap文本使用基础案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 我眼中的WebViewJavascriptBridge

    周六阳光明媚的早晨,非常适合整理和分享一些以前玩过的东西.曾经的工作中参与过一段时间iOS开发,在开发中有个小小的框架让我非常深刻,就是WebViewJavascriptBridge,用于原生控件与前 ...

  5. 关于java数据库章节connection连接不成功的时候!!!

    无图,因为忘了截图.但是网上很多说法: 异常那个地方最先是说连接失败的,原因很简单,没有安装Mysql数据库!!!安装了之后出示没有密码,所以程序里面的地方也不要有密码. 然后运行就成功了.相关的安装 ...

  6. div内长串数字或字母不断行处理

    比如: <div>1111tryrt645645rt4554111112324353453454364</div> <div>qwewretrytuytuiyiuo ...

  7. 接受第三方app分享的数据

    前段时间公司项目需要一个需求: 把第三方的app分享的数据接受到自己的apk中, 涉及到的第三方app是: Youtube/Amazon/NetFlix, 这些app通过分享功能把当前的信息分享出去. ...

  8. mysql全日志(general log)的命令名称

    在源码sql/sql_parse.cc中定义 const LEX_STRING command_name[]={ { C_STRING_WITH_LEN("Sleep") }, { ...

  9. [转]查询 SQL Server 系统目录常见问题

    查询 SQL Server 系统目录常见问题 http://msdn.microsoft.com/zh-cn/library/ms345522.aspx#_FAQ4 下列部分按类别列出常见问题. 数据 ...

  10. less简述

       什么是less? 一种 动态 样式 语言. LESS 将 CSS 赋予了动态语言的特性,如 变量, 继承, 运算, 函数. LESS 既可以在 客户端 上运行 (支持IE 6+, Webkit, ...