背景:
  最近维护一个老旧工程,遇到集团层面的数据安全改造,需要在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. 用简单的代码让一组静态图片变成gif动画

    比如这组图片:     变成这样的gif动画:   是不是很神奇....   先看html .样式.很简单,一个div,然后引入图片.   <!DOCTYPE html> <html ...

  2. java爬虫案例学习

    最近几天很无聊,学习了一下java的爬虫,写一些自己在做这个案例的过程中遇到的问题和一些体会1.学习目标         练习爬取京东的数据,图片+价格+标题等等 2.学习过程 1·开发工具      ...

  3. Git Bash for Windows add ssh key时报Could not open a connection to your authentication agent.

    $ ssh-add id_rsa_bitbucketCould not open a connection to your authentication agent. 运行: $ ssh-agent ...

  4. C语言复习1_变量与数据类型

    变量命名规则: 1.变量名的首字母或下划线(不能是其他特殊符号) 2.变量名的其他字母包含下划线.数字 和字母 3.不能使用关键字 基本数据类型 分为数值型和非数值型,其中数值型分为整型和非整型 整型 ...

  5. Android 混淆那些事儿

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/WmJyiA3fDNriw5qXuoA9MA 作者:l ...

  6. 如何在Linux下查看版本信息

    Linux下如何查看版本信息, 包括位数.版本信息以及CPU内核信息.CPU具体型号等等,整个CPU信息一目了然.   1.# uname -a   (Linux查看版本当前操作系统内核信息)   L ...

  7. The algorithm learning of sort which include Bubblesort,Insertsort,Quicksort and Mergesort.

    Notice : these algorithms achieved by Java. So,let's going to it. firstly, what is Bubblesort? why w ...

  8. [Swift]LeetCode35. 搜索插入位置 | Search Insert Position

    Given a sorted array and a target value, return the index if the target is found. If not, return the ...

  9. [Swift]LeetCode622. 设计循环队列 | Design Circular Queue

    Design your implementation of the circular queue. The circular queue is a linear data structure in w ...

  10. [Swift]LeetCode914.一副牌中的X | X of a Kind in a Deck of Cards

    In a deck of cards, each card has an integer written on it. Return true if and only if you can choos ...