1. 程式人生 > >springboot~通過面向介面程式設計對控制反轉IOC的理解

springboot~通過面向介面程式設計對控制反轉IOC的理解

IOC,把控制反轉到業務端,這句話沒什麼問題,在springboot框架裡,物件的管理是通過spring ioc來實現的,而開發人員的開發原則裡總是說“面向介面程式設計”,而為什麼要面向介面卻沒幾個人能說出來,今天在寫一個基於redis的手動分佈鎖時,對這個面向介面和控制反轉又有了一個體會。 # 底層程式碼更需要面向介面 當你為開發人員提供一個封閉的包時,他們是直接用的,他們不會修改你的程式碼,當然他們可以去繼承並擴充套件;當然如果你不希望被繼承可以宣告為`final`,這都是面向物件程式設計裡提供好的功能,我們主要看`控制反轉`這句話,它把控制權交給了上層去實現,底層通過 面向`介面` 的原則只設計一個規範,而又使用者去實現;但框架功能裡的細節是要有的,這類似於“模版方法”模式,底層框架實現了流程,而個性化的部分由上層去實現。 # 看jpa裡的審計介面 ``` public interface AuditorAware { /** * Returns the current auditor of the application. * * @return the current auditor */ Optional getCurrentAuditor(); } ``` 上面這個泛型介面只有一個方法,需要讓上層開發人員根據自己的業務去實現它,比較返回一個當前登陸的使用者實體,或者返回使用者名稱稱,然後底層框架裡直接使用這個AuditorAware介面的物件;當然如果你的底層只接收一個String型別的值,你也可以去派生一個個性化介面,讓上層開發人員去實現你的介面即可。 ``` /** * 返回使用者ID的標識介面,由程式使用者去實現. */ public interface UserIdAuditorAware extends AuditorAware { } ``` 上面程式碼更加準確的規定了AuditorAware是一個字串的介面,只返回使用者ID即可。 ``` @Component public class CurrentUserAware implements UserIdAuditorAware { @Autowired ApplicationContext applicationContext; @Override public Optional 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例項返回的值為空"); // 程式碼略 } ``` 對於一個小小的功能,我們在經過思考之後,對於之前學過的東西進行總結,你可能會想法某種設計模式、某個演算法、某個原則、在使用它們之後,讓你的程式碼擴充套件性更好,這種程式碼也彷彿有了