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(1)
分类:
其它 / 系统架构
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
2019-08-21 springboot中使用aop技术
2018-08-21 springboot~maven制作底层公用库
2018-08-21 我的那些年(9)~我来团队了,Mvc兴起了
2017-08-21 持续集成~Jenkins构建dotnetCore的项目