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

    Turn the corner Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...

  2. linux中的权限

    第1章 显示或设置网络相关信息 1.1 ip address 与ifconfig 类似 [root@znix ~]# ip address 1: lo: <LOOPBACK,UP,LOWER_U ...

  3. 跨域请求CORS

    参考:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS http://www.ruanyifeng.com/b ...

  4. Linux特殊字符用法、后台命令管理

    !! 重复前一个命令!字符 重复前一个以"字符"开头的命令!num 安装history命令的序号执行命令!?abc 重复之前包含"abc"的命令!-n 重复倒数 ...

  5. Java多线程Lock

    JDK5以后为代码的同步提供了更加灵活的Lock+Condition模式,并且一个Lock可以绑定多个Condition对象 1.把原来的使用synchronized修饰或者封装的代码块用lock.l ...

  6. iOS隐藏导航栏底部灰线

    首先创建 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #de38a5 } span.s1 { } span.s ...

  7. 100000个嵌入式学习者遇到的PING不通问题,我们使用这一个视频就解决了,牛!

    在10多年的售后答疑历程中,我们每天都会遇到开发板.windows,ubuntu三者之间的PING通问题,常常中断手头中的工作去解决这类问题,甚至跟客户远程协助,颇耗时间与精力,在热心网友.答疑助手们 ...

  8. tornado的非异步阻塞模式

    [优化tornado阻塞任务的三个选择] 1.优化阻塞的任务,使其执行时间更快.经常由于是一个DB的慢查询,或者复杂的上层模板导致的,这个时候首要的是加速这些任务,而不是优化复杂的webserver. ...

  9. pt-tcp-model

    http://blog.9minutesnooze.com/analyzing-http-traffic-tcpdump-perconas-pttcpmodel/ #获取200k个packets tc ...

  10. yaml在python中的应用简单整理

    #简单介绍============================================================== YAML使用寄主语言的数据类型,这在多种语言中流传的时候可能会引 ...