自動注入到底比new好在哪?

時間 2021-05-06 17:30:47

1樓:微笑的土魚

你是你們公司搞後勤的,負責所有部門的下午茶。

你現在有一台咖啡機,可以製作咖啡和奶茶

假設乙個部門50人,向你申報50杯奶茶,你用咖啡機一杯一杯地製作(new),做完正準備給他們送過去,接到他們的通知,一部分人不想喝奶茶了,想要喝咖啡,得嘞,得倒掉一部分奶茶騰出杯子再製作咖啡。

你累嗎?

你還有一種方案,向採購部申請資金,購買瓶裝奶茶和咖啡,把它們放到乙個框裡(注入或者配置進容器),然後把這個裝了奶茶和咖啡的框搬到他們辦公室,他們想喝什麼自己拿就行了。

你是不是輕鬆了很多?

比喻可能不恰當,但差不多就是這個理

2樓:一朵雲

abcde 5個controller,每個controller都依賴ABCDE5個service,每個service都依賴QWERT5個dao,來,用new試試

3樓:大寬寬

可以這樣感受下。不要用spring,只用jersey + hibernate。自己編寫乙個生產用的服務。

如果最後發出一聲嘆息「還是spring注入好用」,就能明白為什麼了。

補乙個答案。

spring的依賴注入到底有什麼優勢?

4樓:fifman

我覺得最核心的並不是自動注入本身,而是自動注入所使用的技術:反射。

反射能讓框架在你的類例項裡新增很多aop私貨,這些私貨才是 spring 最強的點。

5樓:

當然是解藕,和方便了,spring自動配裝bean,直接注入就可以用,不用管這個bean是怎麼配裝,你要乙個乙個new要搞多久,你以為乙個bean是很容易配裝的?比如要使用服務a,這個又依賴了服務bcd,其中這些又依賴其他的服務,這樣的巢狀依賴情況你怎麼new?況且都是注入的介面,你還沒法new出來,就這些優勢還沒提到配合spring的若干技術和框架

6樓:

spring的注入是帶工廠的啊。你拿這個比手寫的new那好處太明顯了。很多人都說了。

如果你自己實現工廠,把你的new包裝在你自己的工廠裡。把物件通過工廠管理。

那spring這套其實好處就沒那麼大了。

spring這個玩法只是依賴注入的一種實現,你不用變數註解。建立物件時宣告需要顯式注入也一樣是依賴注入。

而且直接變數註解注入的方式其實並沒有構造方法或者set方法注入好。因為變數私有,不深入實現類並不知道需要這個物件。而構造方法或者set則是一種宣告。

呼叫方在外部就可以了解到正確使用需要提供的物件。

真沒想到這個問題居然還有爭論的。

7樓:DotneterBruce

你可以new乙個物件,你能到處保證他的生命週期嗎?

你能保證你會在需要使用單例的場景而去忘我的new一下嗎?

你希望你的某個context只存在於某個scope,那你在使用單例和new之間如何達到乙個平衡。

如果可以得話可以自己嘗試實現乙個滿足,單例,scope以及new的IOC手寫框架。

8樓:施建航

自動注入是形式, 本質上是單例模式, 而new每次都建立新物件, 因此注入省記憶體.

2. new要知道建立細節, 注入不需要, 因此注入更符合黎克特制代換等原則

9樓:

假設A,B 都依賴C 我們每次都要通過new A(C c),new B(C c) 或者 setC(c) 方法完成對A物件的構造,假設有很多個類同時依賴C,我們每次都要自己new 或者呼叫set方法進行構造,出現了自動注入之後,容器就幫我們幹這些重複的事。

10樓:Jake

感覺大部分人答案都時很理論的,比如解耦之類的,但是如果真要解耦的話,那就應該用xml而不是註解了,所以從實際角度看根本就沒解耦的事兒。

開發中用autowire之類的註解原因只有乙個:那就是你用了spring框架而已,你用spring那麼就要用依賴注入,比如autowire註解。

所以這個問題的本質時:你為什麼要用spring?

11樓:hubeen

自動注入可以替你以優雅和高效的方式管理物件的生命週期和依賴關係。new只是生命週期的一環。適用於複雜業務系統,類動輒成百上千,表再加百十來個,引用依賴關係錯綜複雜,執行緒池資料庫佇列rpc快取歡聚一堂,自動注入就是救人於水火的神器。

三五個表,幾十個類的簡單系統沒用,自己new簡單粗暴收工拿錢。

12樓:貓騎龍

最大的好處就是單例,省記憶體,省new的時間開銷。

預設scope是單例,而你new多來多少個,就是多少個例項。

乙個實現不管被多少個其它地方使用,都只有乙個例項生成,節省記憶體。

只需要系統啟動的時候去把例項生成一遍就可以了,之後是常駐記憶體,後續操作不需要再new了,提高響應時間。

13樓:libla

手動new,就會在new的地方多乙個耦合。

解藕的最佳方式是每個模組各寫各的,執行時會自動組合起來(類似註解的方式),各個模組完全可以單獨剝離。

其次的是把耦合全部寫在乙個地方(例如config/startup檔案,或者xml配置),這樣其他的模組剝離和組合後,也只需要多改這乙個地方,常見於沒有自省的語言。

最差的是A依賴B,B又依賴C這樣的複雜依賴,模組基本沒法剝離。

14樓:

其他的優勢很多答主都寫了

這裡還有乙個優勢,使用@Resource或者@Autowired 進行注入,可以讓spring框架幫你解決迴圈依賴

另外,aop在乙個service中呼叫是會失效的,這時候還需要自己注入自己來完成乙個類中的方法呼叫使得aop生效

15樓:李遙

有區別但並沒有本質區別。現代的軟體系統都是工作在至少2層編譯器上程式框架工作在一種原生程式語言上,由第一層編譯器處理程式框架呼叫的模組介面規則、配置檔案格式構成第二種ad hoc程式語言。程式框架等價於乙個第二層的ad hoc「編譯器」。

也就是說,程式設計框架也是一種編譯器

DI/IoC不過是盡量不動第一層編譯器,而讓第二層編譯器在執行時起作用而已。說到底,你最後總是要在乙個地方硬編碼具象類名的,無非是用第幾層編譯器的輸入語言來寫而已

16樓:

雖然@Autowire跟new都能獲得物件,但原理是完全不一樣的。

像題主所說的,同樣是每個類裡都要寫一遍,@Autowire每次都從Spring容器裡面拿乙個已經建立好的物件,拿到的都是同乙個物件(單例),new則是每寫一次就會建立乙個新物件,而物件的建立、儲存和銷毀的操作本身也要消耗計算機資源,既然物件建立乙個就夠用了,何必重複new導致增加不必要的開銷呢。

17樓:迷途書童

這是乙個設計問題,是使用者不需要關心物件是怎麼建立的。如果你只是寫簡單的helloworld,你無法感知這種好處,當專案達到一定規模之後,你才能意識到

18樓:小小萬能表

將實現與介面隔離,呼叫方只依賴抽象,這還是很有必要的。

第一、方便協作開發,方便於簡化設計。

第二、方便不同框架之間的整合,這個場景確實有乙個介面多個實現的可能。

第三、有了依賴注入,就可以非常方便的實現切面程式設計。

19樓:颺焱

自動注入並不是用來代替new的,也不會比new好。真要代替new用工廠模式不就行了嗎?

自動注入也即依賴注入等價於控制反轉。依賴注入就是控制反轉,控制反轉就是依賴注入,目的是讓框架知道某些類的存在,從而進行統一的管理。

或者說,當依賴是由框架所提供時,控制權就交到了框架手裡。例如,你買蘋果手機時,蘋果手機外觀什麼樣有哪些功能,都是由蘋果公司說了算。蘋果公司就相當於框架,蘋果公司提供蘋果手機就相當於依賴注入。

20樓:Ken 大神

自動注入是向spring 容器要物件

new 是直接用指定的類建立物件

自動注入也不是說比new的效率要高,只是說自動注入是把物件都交給了spring來管理

交給spring來管理有很多好處

1.避免了耦合,也就是說A呼叫B,不是直接去B裡拿,而是統一的在容器裡拿

2.spring容器管理了這些物件,有很多事情可以做, 例如日誌,異常管理,事務,監控各種AOP的事情

21樓:鐵原

1.能new介面麼?

2. 從結構上spring/autowired和jdk/new一樣的。從功能上,前者是建立模式的特定一種,後者是多種,機制要更豐富

後者是遲繫結,結合各種構建模式,花樣多

22樓:

使用乙個物件和構造並初始化乙個物件,所需要的"資訊"並不一致.

大多時候我們只是想使用乙個物件,對於如何構造這個物件不想管也不一定懂的怎麼管.

如果都是用簡單物件舉例自然看不出來.但是假如你要使用的那個物件,內部還巢狀一些物件,這個物件執行在不同環境的時候初始化方法不一樣(比如開發環境redis是單機,測試環境是哨兵/集群模式)或者需要傳入一系列規則設定.大家肯定還是要不工廠模式,要不單例模式.

然後這種情況越來越多,要構造的物件也越來越複雜.最後發現自己的工廠方法也是寫的很複雜.這樣的話,還不如用Spring.

23樓:繁星若塵

根本不需要像他們講的那麼複雜,就乙個問題。

假如你的testservices1和testservices2都需要testdao,由誰來new呢?

24樓:啊哈

沒有IOC哪來後面的AOP SpringMVC SpringBoot ?我理解IoC是spring生態的一切基礎,沒有這個機制就啥都搞不起來了

25樓:

A a = new A();

B b = new B(a);

C c = new C(a, b);

D d = new D(a, c);

E e = new E(a, b, c);

然後你在寫N的時候需要乙個E

不用ioc需要吧a b c都new一遍

用ioc可以「 @Autoware E e; 」 會簡單不少ioc還有乙個明確的好處是你在這個基礎之上mock測試很方便,替換指定的實現即可。

但是是不是也可以所有ABCDE都static然後不用spring ioc呢?是可以的,有人過去真的這麼做了,目前的CRUD業務,絕大部分service controllor dao/respo 的確都可以靜態化,實際上你ioc現在也絕少使用getBean來獲取非單例模式的物件,如果不考慮延遲載入需求的話,本質上也一樣。

你的直覺也不是無的放矢

26樓:cdgeass

因為你的乙個TestController對應乙個TestService。

然後你有TestService1, TestService2, TestService3,TestService4...TestService999,

並且TesController1用了TestService1..100,

TestController2 用了 TestService1..200

TestController3 用了TestService 2..300

你還想去new 嗎

LaTex 比 Word 好在哪?

好在,一旦你固定了你寫文章的樣式,你不需要被各種格式問題困擾,專注於寫作的內容就可以了。就像我,寫PRD一直使用LaTeX,所以寫出來的文件幾乎都是一模一樣的,所以在規範性和可讀性上就很強了。當然,其它同事要修改就比較麻煩了,畢竟生成的PDF檔案上修改幾乎不可能。有段時間,我甚至用beamer做演示...

民用車,多連桿到底比扭力梁好在哪?

重離子貓貓 民用車日常買菜駕駛根本開不出區別來。車隨著車重,幾何和設計速度,對懸掛的要求會不同,設計會有不同的最優解。多連桿可以在不同的懸掛需求裡,都找到最優解,甚至在轎車轎跑車這個領域做到各方面兼顧。具體到便宜的十幾萬以下的低速低載荷的民用車,絕大多數駕駛場景下,扭力梁就可以得到最優解。而且對於買...

血統金毛到底比普通金毛好在哪?

座頭鯨 我家的是雙血統金毛,買的時候選的是顏值完爆整個狗舍的。可惜免疫力太差,動不動就生病,最近一次送回狗舍後就杳無音訊了,估計這次這個坎邁不過去了。哎 傷心 呵呵噠 第一,血統的金毛跟寵物級的金毛最大差別就是多乙個血統證書,可以查到歷代族譜。不用擔心是串串。第二,雙血統並不一定就好,但普遍來說,毛...