springboot~通过面向接口编程对控制反转IOC的理解
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的理解的更多相关文章
- 依赖注入(DI)和控制反转(IOC)的理解,写的太好了。
学习过spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- 浅析“依赖注入(DI)/控制反转(IOC)”的实现思路
开始学习Spring的时候,对依赖注入(DI)——也叫控制反转(IOC)—— 的理解不是很深刻.随着学习的深入,也逐渐有了自己的认识,在此记录,也希望能帮助其他入门同学更深入地理解Spring.本文不 ...
- 【转载】浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI)
原文地址 http://blog.csdn.net/briblue/article/details/75093382 写这篇文章的原因是这两天在编写关于 Dagger2 主题的博文时,花了大量的精力来 ...
- 依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI)
原文: https://blog.csdn.net/briblue/article/details/75093382 写这篇文章的原因是这两天在编写关于 Dagger2 主题的博文时,花了大量的精力来 ...
- 轻松学,浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI) 依赖注入和控制反转的理解,写的太好了。
轻松学,浅析依赖倒置(DIP).控制反转(IOC)和依赖注入(DI) 2017年07月13日 22:04:39 frank909 阅读数:14269更多 所属专栏: Java 反射基础知识与实战 ...
- 轻松理解 Java开发中的依赖注入(DI)和控制反转(IOC)
前言 关于这个话题, 网上有很多文章,这里, 我希望通过最简单的话语与大家分享. 依赖注入和控制反转两个概念让很多初学这迷惑, 觉得玄之又玄,高深莫测. 这里想先说明两点: 依赖注入和控制反转不是高级 ...
- Spring框架系列(3) - 深入浅出Spring核心之控制反转(IOC)
在Spring基础 - Spring简单例子引入Spring的核心中向你展示了IoC的基础含义,同时以此发散了一些IoC相关知识点; 本节将在此基础上进一步解读IOC的含义以及IOC的使用方式.@pd ...
- 控制反转IoC简介
控制反转IoC简介 在实际的应用开发中,我们需要尽量避免和降低对象间的依赖关系,即降低耦合度.通常的业务对象之间都是互相依赖的,业务对象与业务对象.业务对象与持久层.业务对象与各种资源之间都存在这样或 ...
- 控制反转IOC的依赖注入方式
引言: 项目中遇到关于IOC的一些内容,因为和正常的逻辑代码比较起来,IOC有点反常.因此本文记录IOC的一些基础知识,并附有相应的简单实例,而在实际项目中再复杂的应用也只是在基本应用的基础上扩展而来 ...
随机推荐
- 小白入门python新手教程python
python教程很多,但是需要自学教程更好一些,看自学python教程3遍,然后一步步操作,7天后就会有很大的收货. 要向数据处理方向走,数据处理需要网络爬虫的知识,且更加精进.下面是我从网上查找这方 ...
- java 心跳机制
心跳机制:就是每隔几分钟发送一个固定信息给服务端,服务端收到后回复一个固定信息如果服务端几分钟内没有收到客户端信息则视客户端断开. 心跳包 心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定 ...
- Django学习路6_修改数据库为 mysql ,创建mysql及进行迁徙
在项目的 settings 中修改 DATABASES = { 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os. ...
- MOS 预夹断到底是什么
https://www.cnblogs.com/yeungchie/ MOS管就像一个开关,栅极(Gate)决定源极(Souce)到漏极(Drain)的沟道(Channel)是开还是关.以NMOS为例 ...
- vjudge CountTables/2018雅礼集训 方阵 dp 斯特林反演
LINK:CountTables 神题! 首先单独考虑行不同的情况 设\(f_i\)表示此时有i列且 行都不同. 那么显然有 \(f_i=(c^i)^\underline{n}\) 考虑设\(g_i\ ...
- 一本通 高手训练 1782 分层图 状压dp
LINK:分层图 很精辟的一道题 写的时候没带脑子 导致搞了半天不知道哪错了. 可以想到状压每次到某一层的状态 然后这个表示方案数 多开一维表示此时路径条数的奇偶即可. 不过显然我们只需要知道路径条数 ...
- 移动物体监控系统-sprint3移动监控主系统设计与开发
一.移动监控的原理 通过获取摄像头图像,比较前后每一帧的图像数据,从而实现移动物体监控.所有移动监控原理都是这样,只是图像帧的对比的算法不一样. 二.移动物体监控系统的实现 选择开源的移动监控软件mo ...
- “随手记”开发记录day12
就我们团队昨天的讨论,今天进行更改. 今天我们先简单的更改了之前的粉色背景图,因为用户反应总览界面的“总览”二字,是深粉色背景不太美观.进过多次更改之后使颜色变得更舒适.
- 标星7000+,这个 Python 艺术二维码生成器厉害了!
微信二维码,相信大家也并不陌生,为了生成美观的二维码,许多用户都会利用一些二维码生成工具. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手 ...
- JVM与Java体系结构
参考笔记:https://blog.csdn.net/weixin_45759791/article/details/107322503 前言 作为Java工程师的你曾被伤害过吗?你是否也遇到过这些问 ...