IOC,把控制反转到业务端,这句话没什么问题,在springboot框架里,对象的管理是经过spring ioc来实现的,而开发人员的开发原则里老是说“面向接口编程”,而为何要面向接口却没几我的能说出来,今天在写一个基于redis的手动分布锁时,对这个面向接口和控制反转又有了一个体会。redis
当你为开发人员提供一个封闭的包时,他们是直接用的,他们不会修改你的代码,固然他们能够去继承并扩展;固然若是你不但愿被继承能够声明为final
,这都是面向对象编程里提供好的功能,咱们主要看控制反转
这句话,它把控制权交给了上层去实现,底层经过 面向接口
的原则只设计一个规范,而又使用者去实现;但框架功能里的细节是要有的,这相似于“模版方法”模式,底层框架实现了流程,而个性化的部分由上层去实现。算法
public interface AuditorAware<T> { /** * Returns the current auditor of the application. * * @return the current auditor */ Optional<T> getCurrentAuditor(); }
上面这个泛型接口只有一个方法,须要让上层开发人员根据本身的业务去实现它,比较返回一个当前登录的用户实体,或者返回用户名称,而后底层框架里直接使用这个AuditorAware接口的对象;固然若是你的底层只接收一个String类型的值,你也能够去派生一个个性化接口,让上层开发人员去实现你的接口便可。spring
/** * 返回用户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