1. 程式人生 > >[轉]Spring依賴注入和例項化(new)的差別

[轉]Spring依賴注入和例項化(new)的差別


Spring依賴注入和例項化(new)的差別。

Sping為什麼使用依賴注入而不使用例項化物件的方式?

首先說明一下概念

依賴注入(Dependency of Injection)和控制反轉(Inversion of Control 簡稱:ioc)是一個概念。

具體含義:

   當某個角色(java例項class A,呼叫者)需要另一個角色(另一個Java例項class B,被呼叫者)的協助時,在傳統的程式設計過程中通常由呼叫者來建立被呼叫者的例項(在class A裡面 初始化class B)。
但在Spring裡,建立被呼叫者例項的工作不再由呼叫者來完成。因此成為控制反轉(ioc)。建立被呼叫者例項的工作由Spring容器來完成,然後注入呼叫者

。因此也稱為依賴注入


不管是依賴注入還是控制反轉,都說明Spring採用動態靈活的方式來管理各種物件,物件與物件之間的具體實現互相透明。


在理解依賴注入之前,看如下這個問題在各種社會形態裡如何解決:一個人(Java例項,呼叫者)需要一把斧子(Java例項,被呼叫者)。

-  原始社會裡,幾乎沒有社會分工。需要斧子的人(呼叫者)只能自己去磨一把斧子(被呼叫者)。對應的情形為:Java程式裡的呼叫者自己建立被呼叫者。
- 進入工業社會,工廠出現。斧子不再由普通人完成,而在工廠裡被生產出來,此時需要斧子的人(呼叫者)找到工廠,購買斧子,無須關心斧子的製造過程。對應Java程式的簡單工廠的設計模式。


- 進入“按需分配”社會,需要斧子的人不需要找到工廠,坐在家裡發出一個簡單指令:需要斧子。斧子就自然出現在他面前。對應Spring的依賴注入。

  • 第一種情況下,Java例項的呼叫者建立被呼叫的Java例項,必然要求被呼叫的Java類出現在呼叫者的程式碼裡。無法實現二者之間的鬆耦合。
  • 第二種情況下,呼叫者無須關心被呼叫者具體實現過程,只需要找到符合某種標準(介面)的例項,即可使用。此時呼叫的程式碼面向介面程式設計,可以讓呼叫者和被呼叫者解耦,這也是工廠模式大量使用的原因。但呼叫者需要自己定位工廠,呼叫者與特定工廠耦合在一起。
  • 第三種情況下,呼叫者無須自己定位工廠,程式執行到需要被呼叫者時,系統自動提供被呼叫者例項。事實上,呼叫者和被呼叫者都處於Spring的管理下,二者之間的依賴關係由Spring提供。


所謂依賴注入,是指程式執行過程中,如果需要呼叫另一個物件協助時,無須在程式碼中建立被呼叫者,而是依賴於外部的注入。Spring的依賴注入對呼叫者和被呼叫者幾乎沒有任何要求,完全支援對POJO之間依賴關係的管理。依賴注入通常有三種:

- set設值注入
- 建構函式注入
- spring註解注入



其實我一開始也好樓主有同樣的困惑,但是在專案的慢慢積累,感覺spring的配置檔案太有才了

我就和你分享一點:那就是軟體的後期維護

比如說有一個訂單的DAO介面:interface OrderDAO

在開發的時候我是用的MySql資料庫,實現類為 class MySqlOrderDAOImpl implements OrderDAO

在業務程式碼裡面,我要使用OrderDAO,這沒什麼難的,直接new一個物件不就行了嗎,於是我就這樣了:

OrderDAO dao = new MySqlOrderDAOImpl();

輕鬆完成,最後專案完成,實施運營了,後來客戶發現MySql不行了,要換成Oracle,這不難,我在寫一個OrderDAO的實現類不就行了嗎,於是我兩指一揮:

class OracleOrderDAOImpl implements OrderDAO

可是這樣就又來了一個麻煩就是在我的業務程式碼裡面,我都是自己new的物件,都是“MySqlOrderDAOImpl”,

沒問題,把 “MySqlOrderDAOImpl” 替換成”OracleOrderDAOImpl “就可以了

於是,全體動員,查詢“MySqlOrderDAOImpl”然後替換成”OracleOrderDAOImpl “,這樣浪費了半天,還可能有些地方還沒替換呢

=============================================

後來就想到了spring的Ioc,在配置檔案裡配置OrderDAO的實現類就可以了,只要OrderDAO的有新的實現類,我只是在配置檔案中修改一下就可以了,大概需要幾秒鐘吧,時間太快,沒法計算啊(呵呵)

我知道樓主知道依賴注入,所有配置檔案的細節就不說了,不知道我的分享對樓主是否有幫助注入只需要改XML,例項化要改程式碼。

程式拿到其它地方了,比如說伺服器上,伺服器上沒eclipse,我要改SQL連線的字串,就改XML噻,比改程式碼方便噻。同意樓上的,

相關推薦

[]Spring依賴注入例項(new)的差別

Spring依賴注入和例項化(new)的差別。 Sping為什麼使用依賴注入而不使用例項化物件的方式? 首先說明一下概念 依賴注入(Dependency of Injection)和控制反轉(Inversion of Control 簡稱

Angular2 依賴注入例項過程

這裡會介紹 Angular 的注入器和例項化過程,基於 [email protected] Angular 依賴注入過程主要有下面幾個重要的部分組成: Inject 和 Injectable 裝飾器 解析提供商,構造注入器 獲取例項化物件

spring 依賴注入控制反轉

Ioc—Inversion of Control,即“控制反轉”,不是什麼技術,而是一種設計思想。在Java開發中,Ioc意味著將你設計好的物件交給容器控制,而不是傳統的在你的物件內部直接控制。如何理解好Ioc呢?理解好Ioc的關鍵是要明確“誰控制誰,控制什麼,為何是反轉

Spring Bean的初始例項的區別

準確的說,標題中的初始化指的是Bean Definition的初始化,所以是完全不同的兩個概念。   普通的Java類如果想被SpringIOC容器託管,擁有強大的擴充套件功能和更強大的生命週期,使用者(程式設計師)要做的只是寫配置或者寫註解,然後Spring會做這些事:

Spring 依賴注入實現原理--java反射ASM框架

依賴注入是spring的一個特性,從配置層面解決了程式耦合、依賴問題,spring提供了建構函式依賴注入、Setter方法依賴注入、自動裝配依賴注入和@autowired註解依賴注入等多種實現方式。 那麼依賴注入是如何實現的?第一反應就是java反射唄,比如建構

php 例項 new getinstance

一般在單例模式下使用.getInstance()建立物件;但並不是所有有私有構造方法,對外通過getInstance方法提供 例項的情況就是單例模式。 注:單例模式:一個類有且只有一個例項。 1,一個私有的構造器 2,一個私有的該類型別的變數 3,必須有一個共有的返回型別為該類型別的方法,用來返回這個唯一的

通俗易懂的spring依賴注入(控制反轉)的講解。

Spring 能有效地組織J2EE應用各層的物件。不管是控制層的Action物件,還是業務層的Service物件,還是持久層的DAO物件,都可在Spring的管理下有機地協調、執行。Spring將各層的物件以鬆耦合的方式組織在一起,Action物件無須關心Service物件的具體實現,Service

Spring依賴注入(基於XML配置檔案Annotation的方式完成屬性裝配)

依賴注入的方式(手工裝配): 1.使用bean的構造器注入—基於XML方式 2.使用屬性setter方法注入—基於XML方式 3.使用field注入—基於Annotation方式 注入依賴物件可

Spring依賴注入,帶來的資料初始問題

applicationContext.xml配置檔案1.舉個例子:<bean id="AService" class="com.backgroud.restful.AService"> </bean><context:component-scan

Spring的四種依賴注入方式例項

// 第三種方式,靜態工廠方式,在工廠類中返回靜態IOCFactory物件 public void setIOCdependency(IOCdependency iocdenpendency) { this.IOCdependency = iocdenpendency; }與上面兩個方法不同,這次在配置檔案中

Spring依賴注入的普通方式註解方式

純屬自己的筆記本,方便複習用 Spring主要作用就是為程式碼“解耦”,降低程式碼間的耦合度 spring注入是指在啟動spring容器載入bean的時候,完成對變數的賦值行為 第一種: 在建立Product的時候注入一個Category物件  這裡為什麼要把Ca

Spring依賴注入與直接new

通過BeanFactory獲取Bean與直接new一個Bean是完全不同的。不相同的地方在於:從factory中得到的bean是被注入依賴關係的bean,而new出來的bean則沒有依賴關係,屬性是空的。通過BeanFactory獲取的bean能將所有依賴注入到bean中,屬

spring 依賴注入的理解

先看一段程式碼假設你編寫了兩個類,一個是人(Person),一個是手機(Mobile)。 人有時候需要用手機打電話,需要用到手機的dialUp方法。 傳統的寫法是這樣: Java code public class Person{ public boolean makeCall(long nu

Spring依賴注入static靜態變數相關問題

Spring依賴注入static靜態變數相關問題   版權宣告:本文為博主原創文章,轉載請註明出處,謝謝。 https://blog.csdn.net/rongxiang111/article/details/78881371 1.Spring不支援依賴注入static靜態變數

spring bean 靜態工廠例項

spring bean 靜態工廠例項化 在工廠類中建立一個靜態方法來例項化物件。在配置bean時,class指定靜態工廠類,同時還需要使用factory-method屬性指定工廠類中的靜態方法。 1.建立工廠類BeanStaticFactory package instance

spring bean 構造方法例項

spring框架例項化bean有3中方式,即構造方法例項化、靜態工廠例項化、例項工廠例項化(其中,最常用的是構造方法例項化) 構造方法例項化 spring容器可以呼叫bean對應類中的無引數構造方法來例項化bean,這種方式稱為構造方法例項化 1.建立web應用,並匯入依賴的jar包

Flask高階應用01--環境搭建例項藍圖

一、Flask簡介 Flask是一個基於Python實現的web開發的’微’框架,Flask和Django一樣,也是一個基於MVC設計模式的Web框架 [中文文件地址]http://docs.jinkan.org/docs/flask/ http://www.pythondoc.co

Spring依賴注入(構造引數注入、集合,陣列屬性注入、XML自動注入 ,全註解配置)

依賴注入 構造引數注入        --> 常用的是方案一和方案二         MyBean類  YouBean類 <?xml version="1.0" encodin

輕鬆理解-中高階java開發必知必會之 依賴注入控制反轉

關於Ioc和DI在網上隨便一搜都有很多,但是很多人的講解呢,就是讓人感覺深奧,看多了反而有些摸不清了,下面是我找到的一個利於理解的講解可以看下 Ioc (控制反轉)   首先想說說Ioc(Inversion of Control,控制反轉)。這是spring的核心,貫穿始終。所謂Ioc,對於

依賴注入Butter Knife原始碼分析

一、控制反轉和依賴注入: 兩圖的區別: (1)圖一有高度的耦合性,多個物件相互依賴,如果ObjectA想讓ObjectB跟隨自己轉動應該怎麼做? 在ObjectA中建立一個ObjectB的物件,然後呼叫ObjectB的某個方法進行轉動。ObjectA主動控制Objec