IOC,把控制反转到业务端,这句话没什么问题,在springboot框架里,对象的管理是通过spring ioc来实现的,而开发人员的开发原则里总是说“面向接口编程”,而为什么要面向接口却没几个人能说出来,今天在写一个基于redis的手动分布锁时,对这个面向接口和控制反转又有了一个体会。

底层代码更需要面向接口

当你为开发人员提供一个封闭的包时,他们是直接用的,他们不会修改你的代码,当然他们可以去继承并扩展;当然如果你不希望被继承可以声明为final,这都是面向对象编程里提供好的功能,我们主要看控制反转这句话,它把控制权交给了上层去实现,底层通过 面向接口 的原则只设计一个规范,而又使用者去实现;但框架功能里的细节是要有的,这类似于“模版方法”模式,底层框架实现了流程,而个性化的部分由上层去实现。

看jpa里的审计接口

public interface AuditorAware<T> {

	/**
* Returns the current auditor of the application.
*
* @return the current auditor
*/
Optional<T> getCurrentAuditor();
}

上面这个泛型接口只有一个方法,需要让上层开发人员根据自己的业务去实现它,比较返回一个当前登陆的用户实体,或者返回用户名称,然后底层框架里直接使用这个AuditorAware接口的对象;当然如果你的底层只接收一个String类型的值,你也可以去派生一个个性化接口,让上层开发人员去实现你的接口即可。

/**
* 返回用户ID的标识接口,由程序使用者去实现.
*/
public interface UserIdAuditorAware extends AuditorAware<String> { }

上面代码更加准确的规定了AuditorAware是一个字符串的接口,只返回用户ID即可。

@Component
public class CurrentUserAware implements UserIdAuditorAware {
@Autowired
ApplicationContext applicationContext; @Override
public Optional<String> getCurrentAuditor() {
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = requestAttributes.getRequest();
return Optional.of(request.getSession().getAttribute("id").toString());
}
}

我们的底层代码会使用它的getCurrentAuditor()返回值 ,它是一个字符串。

public Object execute(String sourceId, Integer timeout, TimeUnit unit) {
Assert.notNull(sourceId, "sourceId不能为空");
String key = getKey(sourceId);
String user = auditorAware.getCurrentAuditor().orElse(null);
Assert.notNull(user, "AuditorAware实例返回的值为空");
// 代码略
}

对于一个小小的功能,我们在经过思考之后,对于之前学过的东西进行总结,你可能会想法某种设计模式、某个算法、某个原则、在使用它们之后,让你的代码扩展性更好,这种代码也仿佛有了生命!

springboot~通过面向接口编程对控制反转IOC的理解的更多相关文章

  1. 依赖注入(DI)和控制反转(IOC)的理解,写的太好了。

    学习过spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

  2. 浅析“依赖注入(DI)/控制反转(IOC)”的实现思路

    开始学习Spring的时候,对依赖注入(DI)——也叫控制反转(IOC)—— 的理解不是很深刻.随着学习的深入,也逐渐有了自己的认识,在此记录,也希望能帮助其他入门同学更深入地理解Spring.本文不 ...

  3. 【转载】浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI)

    原文地址 http://blog.csdn.net/briblue/article/details/75093382 写这篇文章的原因是这两天在编写关于 Dagger2 主题的博文时,花了大量的精力来 ...

  4. 依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI)

    原文: https://blog.csdn.net/briblue/article/details/75093382 写这篇文章的原因是这两天在编写关于 Dagger2 主题的博文时,花了大量的精力来 ...

  5. 轻松学,浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI) 依赖注入和控制反转的理解,写的太好了。

    轻松学,浅析依赖倒置(DIP).控制反转(IOC)和依赖注入(DI) 2017年07月13日 22:04:39 frank909 阅读数:14269更多 所属专栏: Java 反射基础知识与实战   ...

  6. 轻松理解 Java开发中的依赖注入(DI)和控制反转(IOC)

    前言 关于这个话题, 网上有很多文章,这里, 我希望通过最简单的话语与大家分享. 依赖注入和控制反转两个概念让很多初学这迷惑, 觉得玄之又玄,高深莫测. 这里想先说明两点: 依赖注入和控制反转不是高级 ...

  7. Spring框架系列(3) - 深入浅出Spring核心之控制反转(IOC)

    在Spring基础 - Spring简单例子引入Spring的核心中向你展示了IoC的基础含义,同时以此发散了一些IoC相关知识点; 本节将在此基础上进一步解读IOC的含义以及IOC的使用方式.@pd ...

  8. 控制反转IoC简介

    控制反转IoC简介 在实际的应用开发中,我们需要尽量避免和降低对象间的依赖关系,即降低耦合度.通常的业务对象之间都是互相依赖的,业务对象与业务对象.业务对象与持久层.业务对象与各种资源之间都存在这样或 ...

  9. 控制反转IOC的依赖注入方式

    引言: 项目中遇到关于IOC的一些内容,因为和正常的逻辑代码比较起来,IOC有点反常.因此本文记录IOC的一些基础知识,并附有相应的简单实例,而在实际项目中再复杂的应用也只是在基本应用的基础上扩展而来 ...

随机推荐

  1. 给Django Admin添加验证码和多次登录尝试限制

    Django自带的Admin很好用,但是放到生产环境总还差了点什么= = 看看admin的介绍: Django奉行Python的内置电池哲学.它自带了一系列在Web开发中用于解决常见问题或需求的额外的 ...

  2. ANDROID自定义视图——onMeasure,MeasureSpec源码 流程 思路详解

    简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量--onMeasure():决定View的大小 2.布局--onLayout():决定View在ViewGroup中的位置 3. ...

  3. JAVA OOP 编程-常用设计模式

    smart-design-pattern 吼吼!10分钟内快速回顾所有设计模式及应用场景 其实,工作三年以上,精通coding,深知并发编程,熟悉OOP思想,但却因为种种原因! 没有在学习生涯初期就看 ...

  4. 《吊打面试官》系列-Redis基础知识

    前言Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难.作为一个在互联网公司面一次拿一次offer的面霸(请允许我使用一下 ...

  5. OpenLDAP on Centos7

    一.环境准备 echo nameserver 114.114.114.114 > /etc/resolv.conf ##更改DNSecho 192.168.0.190 hello.com > ...

  6. 萌新学渗透之Hack The Box_Beep

    我将我的walkthrough过程用视频解说的形式记载 视频地址https://www.bilibili.com/video/BV1VT4y1j7dg 一是因为看我视频的后来者应该都是刚入门的新手,视 ...

  7. 什么是 A/B 测试?

    1.什么是A/B 测试?有什么用? 做过App功能设计的读者朋友可能经常会面临多个设计方案的选择,例如某个按钮是用蓝色还是黄色,是放左边还是放右边. 传统的解决方法通常是集体讨论表决,或者由某位专家或 ...

  8. RectTransform的localPosition与anchoredPosition(3D)的区别

    RectTransform继承自Transform,用于描述矩形的坐标(Position),尺寸(Size),锚点(anchor)和中心点(pivot)等信息,每个2D布局下的元素都会自动生成该组件. ...

  9. 牛客挑战赛39 D 牛牛的数学题 NTT FMT FWT

    LINK:牛牛的数学题 题目看起来很不可做的样子. 但是 不难分析一下i,j之间的关系. 对于x=i|j且i&j==0, i,j一定是x的子集 我们可以暴力枚举子集来处理x这个数组. 考虑 x ...

  10. 用好这几个技巧,解决Maven Jar包冲突易如反掌

    前言 大家在项目中肯定有碰到过Maven的Jar包冲突问题,经常出现的场景为: 本地运行报NoSuchMethodError,ClassNotFoundException.明明在依赖里有这个Jar包啊 ...