標籤:style javabean rri 常見 manager 完整 for span adduser
在spring ioc中有三種依賴注入,分別是:
a、介面注入;
b、setter方法注入;
c、構造方法注入;
介面注入:
public class ClassA { private InterfaceB clzB; public void doSomething() { Ojbect obj = Class.forName(Config.BImplementation).newInstance(); clzB = (InterfaceB)obj; clzB.doIt(); } …… }
解釋一下上述的代碼部分,ClassA依賴於InterfaceB的實現,我們如何獲得InterfaceB的實現執行個體呢?傳統的方法是在代碼中建立 InterfaceB實作類別的執行個體,並將賦予clzB.這樣一來,ClassA在編譯期即依賴於InterfaceB的實現。為了將調用者與實現者在編譯期分離,於是有了上面的代碼。我們根據預先在設定檔中設定的實作類別的類名(Config.BImplementation),動態載入實作類別,並通過InterfaceB強制轉型後為ClassA所用,這就是介面注入的一個最原始的雛形。
setter方法注入
import com.tgb.spring.dao.UserDao; public class UserManagerImpl implements UserManager{ private UserDao userDao; //使用設值方式賦值 public void setUserDao(UserDao userDao) { this.userDao = userDao; } @Override public void addUser(String userName, String password) { userDao.addUser(userName, password); } }
構造器注入
import com.tgb.spring.dao.UserDao; public class UserManagerImpl implements UserManager{ private UserDao userDao; //使用構造方式賦值 public UserManagerImpl(UserDao userDao) { this.userDao = userDao; } @Override public void addUser(String userName, String password) { userDao.addUser(userName, password); } }
三者之間的比較:
介面注入:
介面注入模式因為具備侵入性,它要求組件必須與特定的介面相關聯,因此並不被看好,實際使用有限。
Setter 注入:
對於習慣了傳統 javabean 開發的程式員,通過 setter 方法設定依賴關係更加直觀。如果依賴關係較為複雜,那麼構造子注入模式的建構函式也會相當龐大,而此時設值注入模式則更為簡潔。如果用到了第三方類庫,可能要求我們的組件提供一個預設的建構函式,此時構造子注入模式也不適用。
構造器注入:
在構造期間完成一個完整的、合法的對象。所有依賴關係在建構函式中集中呈現。依賴關係在構造時由容器一次性設定,組件被建立之後一直處於相對“不變”的穩定點。只有組件的建立者關心其內部依賴關係,對調用者而言,該依賴關係處於“黑盒”之中。
個人推薦使用第三種,博主本人的企業專案中也是使用第三種方式。
spring IOC的常見幾種以來注入的方式