相關閱讀:java
JAVA編程思想(二)如何面向接口編程
JAVA編程思想(三)去掉彆扭的if,自注冊策略模式優雅知足開閉原則
JAVA編程思想(四)Builder模式經典範式以及和工廠模式如何選?
JAVA基礎(三)ClassLoader實現熱加載
Java併發編程入門(十一)限流場景和Spring限流器實現
HikariPool源碼(二)設計思想借鑑
人在職場(一)IT大廠生存法則spring
當注入的是接口,再由調用者注入具體接口實現類時就提升了擴展性。編程
在spring中,依賴注入有如下幾種方式:併發
- 經過類成員注入
- 經過構造器注入
- 經過方法參數注入
普通的java程序也能夠經過這幾種方式注入,那麼何時用什麼依賴注入方式合適? 這要從下面幾個方面考慮:post
經過屬性注入,注入的類在類定義時已經固定寫死,不可改變;而經過構造器注入和方法注入,則能夠由調用者在調用時傳入,增長了可擴展性。ui
經過屬性注入和構造器注入,意味着注入類的生命週期和宿主類的生命週期同樣,只要宿主類存在注入類就存在,也就是說這段時間注入類會一直佔用內存;而經過方法注入,意味着通常狀況下注入類僅在此方法內使用,方法結束,注入類的生命週期就結束,佔用內存得以釋放。spa
根據以上這兩點,咱們就能夠很容易判斷什麼時候應該使用哪一種方式注入。線程
下面,咱們經過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) {
複製代碼
- 依賴注入是提升擴展性的最佳方式,他將可擴展性交給了調用者,其自由度更高,而不是自行經過多種默認實現來提供擴展性,二者在擴展的廣度上是沒法相提並論的。
- 根據不一樣的場景合理肯定依賴注入的方式是構造器注入仍是方法注入。
- 不要由於依賴注入提供了強大的可擴展性,就在任什麼時候候都使用它,而應聽從適用原則僅在須要的時候使用它。
end.
<--感謝三連擊,左邊點贊和關注。