JDK8新特性:default方法的应用实践
背景:
最近维护一个老旧工程,遇到集团层面的数据安全改造,需要在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方法的应用实践的更多相关文章
- Java 8新特性——default方法(defender方法)介绍
我们都知道在Java语言的接口中只能定义方法名,而不能包含方法的具体实现代码.接口中定义的方法必须在接口的非抽象子类中实现.下面就是关于接口的一个例子: 1 2 3 4 5 6 7 8 9 10 11 ...
- JDK8新特性04 方法引用与构造器引用
import java.io.PrintStream; import java.util.Comparator; import java.util.function.*; /** * 一.方法引用 * ...
- JDK8新特性,方法的引用
引用方法并运行 在Java中,方法和构造方法都看作是对象的一种,那么你要引用它(不是调用),则可以用::来引用.用来存储这个引用的类型用@FunctionlaInterface注解来标识. 示例: p ...
- JDK8新特性之方法引用
什么是方法引用 方法引用是只需要使用方法的名字,而具体调用交给函数式接口,需要和Lambda表达式配合使用. 如: List<String> list = Arrays.asList(&q ...
- JDK8新特性一览
转载自:http://blog.csdn.net/qiubabin/article/details/70256683 官方新特性说明地址 Jdk8新特性.png 下面对几个常用的特性做下重点说明. 一 ...
- 一次电话Java面试的问题总结(JDK8新特性、哈希冲突、HashMap原理、线程安全、Linux查询命令、Hadoop节点)
面试涉及问题含有: Java JDK8新特性 集合(哈希冲突.HashMap的原理.自动排序的集合TreeSet) 多线程安全问题 String和StringBuffer JVM 原理.运行流程.内部 ...
- JDK8新特性:使用stream、Comparator和Method Reference实现集合的优雅排序
大家对java接口Comparator和Comparable都不陌生,JDK8里面Comparable还和以前一样,没有什么改动:但是Comparator在之前基础上增加了很多static和defau ...
- JDK8 新特性
JDK8 新特性目录导航: Lambda 表达式 函数式接口 方法引用.构造器引用和数组引用 接口支持默认方法和静态方法 Stream API 增强类型推断 新的日期时间 API Optional 类 ...
- jdk8新特性
JDK8新特性(JDK8的新特性) * 接口中可以定义有方法体的方法,如果是非静态,必须用default修饰 * 如果是静态的就不用了 class Test { public void run() { ...
- JDK8新特性关于Stream流
在Java1.8之前还没有stream流式算法的时候,我们要是在一个放有多个User对象的list集合中,将每个User对象的主键ID取出,组合成一个新的集合,首先想到的肯定是遍历,如下: 1 2 3 ...
随机推荐
- select标签默认选项
1.selected:默认选择该选项: 2.disabled:该选项不能被鼠标选择:(注:选项没有被隐藏的时候) 3.style="display:none":隐藏该选项:(注:该 ...
- 面试题5-[剑指offer] 二维数组中的查找
题目 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...
- 约瑟夫环问题 --链表 C语言
总共有m个人在圆桌上,依次报名,数到第n个数的人退出圆桌,下一个由退出人下一个开始继续报名,循环直到最后一个停止将编号输出 #include <stdio.h>#include <s ...
- Raiden Charge
2017年10月22 周日 这是个元气满满 值得纪念的一天(不好意思走错片场了) 虽然有各种乱遭的客观元素 但我们队确确实实地打铁了 那些我们轻视的 野鸡(误)大学 都在我们前面 都说知耻而后勇 虽然 ...
- Java设计模式之单例模式,笔记完整到不敢想象
单例模式: 作用 保证一个类只有一个实例,并且提供一个访问该实例的全局访问入口 单例模式的常用 1.Windows的任务管理器2.Windows的回收站,也是一个单例应用3.项目中的读取配置文件的对象 ...
- [Swift]LeetCode969.煎饼排序 | Pancake Sorting
Given an array A, we can perform a pancake flip: We choose some positive integer k <= A.length, t ...
- [Swift]LeetCode1020. 飞地的数量 | Number of Enclaves
Given a 2D array A, each cell is 0 (representing sea) or 1 (representing land) A move consists of wa ...
- 如何将项目上传到GitHub?
如何将项目上传到GitHub? 1.注册GitHub账户 浏览器输入GitHub官网地址:https://github.com/ 进入后点击Sign In 然后点击Create an account ...
- 参数验证 @Validated 和 @Valid 的区别
来源:blog.csdn.net/qq_27680317/article/details/79970590 整编:Java技术栈(公众号ID:javastack) Spring Validation验 ...
- 第三周 IP通信基础回顾
本周的知识归纳如下:Hubs工作在物理层,物理层所有的设备都处于同一个冲突域,所有的设备都处于同一个广播域,设备共享相同的带宽. MAC地址48位, MAC帧结构 #字符 8 ...