JAVA編程思想(一)經過依賴注入增長擴展性

Java極客  |  做者  /  鏗然一葉
這是Java極客的第 58 篇原創文章

相關閱讀:java

JAVA編程思想(二)如何面向接口編程
JAVA編程思想(三)去掉彆扭的if,自注冊策略模式優雅知足開閉原則
JAVA編程思想(四)Builder模式經典範式以及和工廠模式如何選?
JAVA基礎(三)ClassLoader實現熱加載
Java併發編程入門(十一)限流場景和Spring限流器實現
HikariPool源碼(二)設計思想借鑑
人在職場(一)IT大廠生存法則spring

1. 依賴注入如何提升擴展性

當注入的是接口,再由調用者注入具體接口實現類時就提升了擴展性。編程

2. 依賴注入的時機把握

在spring中,依賴注入有如下幾種方式:併發

  1. 經過類成員注入
  2. 經過構造器注入
  3. 經過方法參數注入

普通的java程序也能夠經過這幾種方式注入,那麼何時用什麼依賴注入方式合適? 這要從下面幾個方面考慮:post

擴展性

經過屬性注入,注入的類在類定義時已經固定寫死,不可改變;而經過構造器注入和方法注入,則能夠由調用者在調用時傳入,增長了可擴展性。ui

生命週期

經過屬性注入和構造器注入,意味着注入類的生命週期和宿主類的生命週期同樣,只要宿主類存在注入類就存在,也就是說這段時間注入類會一直佔用內存;而經過方法注入,意味着通常狀況下注入類僅在此方法內使用,方法結束,注入類的生命週期就結束,佔用內存得以釋放。spa

根據以上這兩點,咱們就能夠很容易判斷什麼時候應該使用哪一種方式注入。線程

3. 依賴注入提升擴展性舉例

下面,咱們經過java的JUC包下的ThreadPoolExecutor類來看依賴注入是如何提升擴展性的。設計


其中綠色部分都是接口,可由調用者提供具體實現並注入,這樣就極大的提升了擴展性。各個接口職責說明以下:

職責
ThreadPoolExecutor 線程執行器
BlockingQueue 線程池所使用的緩衝隊列,隊列長度決定了可以緩衝的最大工做線程數量
Runnable 線程隊列中的Runnable
ThreadFactory 建立工做線程的線程工廠
RejectedExecutionHandler 線程執行器中線程隊列滿時增長新線程的處理策略接口
DiscardOldestPolicy 拋棄線程隊列中最老的未執行工做線程,添加新的工做線程。
CallerRunsPolicy 重複執行,直到成功,在closeConnectionExecutor中使用。
AbortPolicy 拋棄超出線程隊列負載的工做線程,並拋出異常。
DiscardPolicy 忽略超出線程隊列複雜的工做線程,不作任何處理。

各接口的注入方式爲構造器注入:code

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) {
複製代碼

4. 總結

  1. 依賴注入是提升擴展性的最佳方式,他將可擴展性交給了調用者,其自由度更高,而不是自行經過多種默認實現來提供擴展性,二者在擴展的廣度上是沒法相提並論的。
  2. 根據不一樣的場景合理肯定依賴注入的方式是構造器注入仍是方法注入。
  3. 不要由於依賴注入提供了強大的可擴展性,就在任什麼時候候都使用它,而應聽從適用原則僅在須要的時候使用它。

end.


<--感謝三連擊,左邊點贊和關注。

相關文章
相關標籤/搜索