背景:
  最近维护一个老旧工程,遇到集团层面的数据安全改造,需要在DAO层做加解密改造。而这个老旧工程的DAO层是用的JdbcTemplate实现的,尽管template方式实现起来可自由发挥的空间很大,但是因为跟其他其他服务的技术栈不统一,无法实现统一加解密,所以考虑把JdbcTemplate升级到Mybatis。

过程:
  升级的关键问题就是原来的 xxDaoImpl类里写了大量的业务逻辑(显然,程序员们在这里没有很好的遵循开发规范),而Mybatis是通过对Dao接口做动态代理并映射到 xxMapper.xml上的(底层是用的JDK动态代理,不能直接对实现类做增强,所以只能改成接口的方式),那么DAO大段大段的逻辑将无处安放,需要做迁移,要么往上迁到service层,要么通过Mybatis的动态sql转换到xml里,然而很不巧的是这个老旧工程是个核心工程,很多服务都直接依赖了它(Dao层依赖),所以把业务逻辑都往上提的话又是一项巨大的工程而且没法保证逻辑迁移时的正确性,对测试的同学来说又是一场灾难(因为我们给出的测试范围就是:所有业务都要测。。)

  经过一番抓耳挠腮后,灵机一动想到了default方法(当初JDK团队引进这个特性就是为了兼容扩展已有接口),我们遇到的场景跟default方法的使用场景非常匹配,把 xxDaoImpl改成接口后,还可以把那一坨一坨的逻辑留在DAO层,而且经过测试,default方法也是可以被代理增强的,所以不会影响Mybatis的Interceptor,也不会影响统一的加解密安全改造。

(截图里还用到了Mybatis-plus,Mybatis的好CP,给他们打个硬广:https://mp.baomidou.com/guide/

至此:

  目前升级改造的技术方案已经验证完毕,再说点感想吧:有时候自己想想,上面的方案有点点Hack的精神,虽然通过技术解决问题是程序员最大的满足和自豪,但是软件、系统、项目等等终究是工程化的东西,按照正常的演进思路就是应该做重构,让编码更符合规范,也为以后的框架升级留够足够的兼容性。但是,作为互联网项目,生命周期短以及朝不保夕是家常便饭的事情,而且一般都是以业务为驱动的,公司要的是爆发式的增长,对技术团队的要求就是能快速响应,持续交付性能强大基本可靠的产品,而对于产品本身的规范性并没有思考的太多,不像传统的大型软件项目,严格按照瀑布模型来工程化的演进。

JDK8新特性:default方法的应用实践的更多相关文章

  1. Java 8新特性——default方法(defender方法)介绍

    我们都知道在Java语言的接口中只能定义方法名,而不能包含方法的具体实现代码.接口中定义的方法必须在接口的非抽象子类中实现.下面就是关于接口的一个例子: 1 2 3 4 5 6 7 8 9 10 11 ...

  2. JDK8新特性04 方法引用与构造器引用

    import java.io.PrintStream; import java.util.Comparator; import java.util.function.*; /** * 一.方法引用 * ...

  3. JDK8新特性,方法的引用

    引用方法并运行 在Java中,方法和构造方法都看作是对象的一种,那么你要引用它(不是调用),则可以用::来引用.用来存储这个引用的类型用@FunctionlaInterface注解来标识. 示例: p ...

  4. JDK8新特性之方法引用

    什么是方法引用 方法引用是只需要使用方法的名字,而具体调用交给函数式接口,需要和Lambda表达式配合使用. 如: List<String> list = Arrays.asList(&q ...

  5. JDK8新特性一览

    转载自:http://blog.csdn.net/qiubabin/article/details/70256683 官方新特性说明地址 Jdk8新特性.png 下面对几个常用的特性做下重点说明. 一 ...

  6. 一次电话Java面试的问题总结(JDK8新特性、哈希冲突、HashMap原理、线程安全、Linux查询命令、Hadoop节点)

    面试涉及问题含有: Java JDK8新特性 集合(哈希冲突.HashMap的原理.自动排序的集合TreeSet) 多线程安全问题 String和StringBuffer JVM 原理.运行流程.内部 ...

  7. JDK8新特性:使用stream、Comparator和Method Reference实现集合的优雅排序

    大家对java接口Comparator和Comparable都不陌生,JDK8里面Comparable还和以前一样,没有什么改动:但是Comparator在之前基础上增加了很多static和defau ...

  8. JDK8 新特性

    JDK8 新特性目录导航: Lambda 表达式 函数式接口 方法引用.构造器引用和数组引用 接口支持默认方法和静态方法 Stream API 增强类型推断 新的日期时间 API Optional 类 ...

  9. jdk8新特性

    JDK8新特性(JDK8的新特性) * 接口中可以定义有方法体的方法,如果是非静态,必须用default修饰 * 如果是静态的就不用了 class Test { public void run() { ...

  10. JDK8新特性关于Stream流

    在Java1.8之前还没有stream流式算法的时候,我们要是在一个放有多个User对象的list集合中,将每个User对象的主键ID取出,组合成一个新的集合,首先想到的肯定是遍历,如下: 1 2 3 ...

随机推荐

  1. LeetCode笔记:39. Combination Sum

    题目描述 给定一个无重复的正整数数组 candidates 和一个正整数 target, 求所有和为 target 的 candidates 中数的组合中.其中相同数的不同顺序组合算做同一种组合,ca ...

  2. Linux 系统中的内部与外部命令

    linux中的命令大致可分为两类,内部命令和外部命令: 内部命令(builtin command):也称shell内嵌命令 外部命令(external command):存放在一个文件中,使用时需要去 ...

  3. gps 经纬度 转换实际距离

    <!doctype html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...

  4. 【计算机篇】Office 2016 for Mac 安装和破解教程

    免责声明 请亲们支持正版.这教程旨在分享,供参考. 为啥写这篇文章 对于大多数使用 Mac 的用户而言,虽然有苹果自家的办公软件,但功能少,用起来不舒服.而 Offer 2016 版的需要登录激活购买 ...

  5. [Swift]LeetCode825. 适龄的朋友 | Friends Of Appropriate Ages

    Some people will make friend requests. The list of their ages is given and ages[i] is the age of the ...

  6. Netty:ChannelInitializer

    1. 作用 用于在某个Channel注册到EventLoop后,对这个Channel执行一些初始化操作.ChannelInitializer虽然会在一开始会被注册到Channel相关的pipeline ...

  7. php内核一些常识

    整个PHP环境和Zend环境会涉及多个全局变量,下面是几个比较重要的: php_core_globals core_globals(main/php_globals.h) ==> PG PHP调 ...

  8. 【Spark篇】---Spark中内存管理和Shuffle参数调优

    一.前述 Spark内存管理 Spark执行应用程序时,Spark集群会启动Driver和Executor两种JVM进程,Driver负责创建SparkContext上下文,提交任务,task的分发等 ...

  9. 微信小程序实战--集阅读与电影于一体的小程序项目(一)

    1.首页欢迎界面 项目目录结构 新建项目ReaderMovie,然后新建文件,结构如下 welcome.wxml <view class='container'> <image cl ...

  10. python3+ selenium3开发环境搭建-手把手教你安装python(详细)

    环境搭建 基于python3和selenium3做自动化测试,俗话说:工欲善其事必先利其器:没有金刚钻就不揽那瓷器活,磨刀不误砍柴工,因此你必须会搭建基本的开发环境,掌握python基本的语法和一个I ...