[轉]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