使用Spring開發的時候,須要全部的類都使用依賴注入嗎?

今天在工做的時候,代碼實現的時候,遇到了一個代碼風格的問題。或者說其實我我的更偏向於這多是依賴注入的濫用問題。spring

原由

說說我遇到的狀況: 咱們與國外的同事一塊兒開發項目,同事作了一記錄event log的功能,放到了common包公共代碼中,須要全部微服務中都引入使用。微服務

簡單地說一下這個的實現吧: common包中提供了一個logAgent,須要全部服務註冊這個logAgent並在須要記錄event的時候,調用裏面的相應方法。 logAgent的底層與其餘服務通訊的邏輯使用的是Redisson提供的RBlockingQueue(別糾結技術棧)。工具

隨後這位同事也在我正在開發的項目中加入了這個類的引用與初始化(兩邊有時差,兩邊都有人負責同一個服務的相同的一些功能,美其名曰「充分利用時間」)。學習

等我早上回到公司review代碼的時候,我以爲新增的代碼有點彆扭不太舒服,先說一下爲何我以爲有點彆扭:測試

做爲生產者的看待這個消息隊列的角色,我在這個公共庫的時候,固然是想要準備好配置,初始化好服務類(logAgent),我就能夠往這個橋樑裏放產品了。 但這位同事這個logAgent的實現中,使用Autowired注入了兩個類,分別是設計

  1. jar包裏自定義的id生成器
  2. 一個BlockingQueue接口對象

在個人服務的配置類中,這位同事註冊了4個類,分別是cdn

  1. RedissonClient
  2. RBlockingQueue(建立時使用了logAgent中的靜態變量做爲Redis key)
  3. jar包裏的id生成器
  4. logAgent

溝通問題

我稍微有點微詞。個人想法是應該儘量不要讓這些內部使用,而且內部就能徹底管理好的類暴露在外面來,提供的工具應該儘可能作到簡單配置簡單使用纔對,並且這個複雜的配置邏輯這位同事也沒有準備任何文檔與註釋,因而我就這個問題發郵件問了一下爲何要這麼設計,隨後闡述了一下個人想法,到這裏爲止我也只是微詞而已。對象

而後這是我最後發過去闡述觀點的郵件,我以爲可能我語氣也不太好blog

個人郵件
但最後我收到的郵件讓我炸了:
收到的回覆

到此我就馬上關掉了郵箱,由於說再多也已經沒用了。 其實以前也有不少關於維護性的、開發流程的、團隊管理的想法我有提出來(肉眼可見的糟糕),也有走人的想法,我最近都在自主學習,因此暫時仍是想着先充實一下知識。 那至少到這裏,我以爲我應該是不太能繼續呆在這個三觀不太符合的公司裏了。接口

回到一下這個問題上

我感受我最後收到的回覆的觀點太絕對了,並且做爲一個被其餘代碼調用的公共組件,不是應該儘可能作到高內聚低耦合嗎? 舉個例子:

  • Spring就家裏的媽媽,在家的時候常常管理個人生活
  • logAgent就像是一部手機

我想象中的使用場景:

  1. 我準備好了手機,交給媽媽管理(註冊bean)
  2. 而有些東西,例如sim卡,手機裏是不可能買來就有的,須要我買手機的時候順便買sim卡插進去,或者使用老媽手上已有的sim卡,
  3. 而後一塊兒再把手機給媽媽管理(bean初始化階段,經過外部傳入參數進行初始化,例如傳入RedisClient做爲參數)
  4. 當我須要使用的時候,媽媽會把手機給我(把logAgent 注入到須要調用的類中)

但上面logAgent的調用就像這樣子:

  1. 我須要買好手機的屏幕、主板、電池、sim卡、空的手機外殼,先交給老媽,
  2. 而後老媽幫我把這些東西組裝到手機外殼裏面,再把手機給我用。
  3. 那若是下次我在作收音機,恰好電池跟手機通用,我問老媽要電池(原本應該是手機的私有組件),老媽把手機的電池裝到了給我測試收音機用光了,那我手機要用的時候豈不是開不了機了?

這麼一類比,我更以爲這種實現不合理了,不只代碼調用麻煩,還有用錯的風險,須要提供更多的文檔說明怎麼使用(這位同事沒提供文檔的問題咱就不糾結了,老問題了)。

結論

我仍是認爲,不只是這種公共jar包提供的組件,項目內部的各類Service、Manager、Helper、Handler、etc.

真的不該該把一些本該對外隱藏的私有組件,交給spring管理,尤爲是這個組件上還保存着狀態信息的,意味着這些組件不只要設置成privite,對外的操做也須要封裝好方法,否則組件裏面的狀態被其餘類經過注入取到並隨意改變後,整個業務邏輯就不對了,不是嗎?

固然我也很想知道我這樣的想法到底有沒有問題,真的須要把什麼東西都丟給Spring管理嗎?歡迎你們告訴我一下大家的想法,謝謝。

相關文章
相關標籤/搜索