這是一個奇怪的例子,但第一個演示什麼是依賴注入容器會做和第二個演示一個對象傳遞一個參數到另一個對象。第一個嵌入它的依賴作爲調用類的實例變量;第二個更具程序性。 本身也不是。這取決於你的依賴有多複雜,以及你想如何管理代碼。
只看你提供的注射器代碼,爲什麼你想要使用依賴注入並不明顯。但暫時考慮一個更復雜(更典型)的例子。
的CustomerService:
public class CustomerService implements ICustomerService {
private IOrderDAO orderDao;
public void setOrderDAO(IOrderDAO orderDao) {
this.orderDao = orderDao;
}
public Order getOrderByDate(Integer customerId, Date date) {
return this.orderDao.findOrderByDate(customerId, date);
}
}
OrderDAO(默認實現):
public OrderDAO implements IOrderDAO {
private javax.sql.DataSource dataSource;
public void setDataSource(javax.sql.DataSource dataSource) {
this.dataSource = dataSource;
}
public Order findOrderByDate(Integer customerId, Date date) {
...
}
}
StubOrderDAO(存根實現):
public StubOrderDAO implements IOrderDAO {
public Order findOrderByDate(Integer customerId, Date date) {
return new HardCodedOrder(); // this class would extend or implement Order
}
}
在運行時,的CustomerService
情況下,不會有任何想法正在使用IOrderDAO的實現。這意味着,例如,您可以非常容易地通過使用StubOrderDAO
(始終返回硬編碼的客戶)初始化它來爲CustomerService引導單元測試。同樣,您的DataSource實現可能會有所不同(模擬數據源或在不同運行時環境中不同的模擬數據源)。
所以用於進行生產的注射器可能看起來像:
// instantiate
CustomerService service = new CustomerService();
OrderDAO dao = new OrderDAO();
javax.sql.dataSource dataSource = jndiContext.lookup("java:comp/env/MyDataSource");
// initialize
dao.setDataSource(dataSource);
service.setOrderDAO(dao);
return service;
而注射器的使用本地(測試)數據源可能看起來像:
// instantiate
CustomerService service = new CustomerService();
OrderDAO dao = new OrderDAO();
javax.sql.dataSource dataSource = new DriverManagerDataSource("jdbc:sqlserver:yadayada...", "myUsername", "myPassword");
// initialize
dao.setDataSource(dataSource);
service.setOrderDAO(dao);
return service;
而對於一個注射器集成測試可能如下所示:
// instantiate
CustomerService service = new CustomerService();
OrderDAO dao = new StubOrderDAO();
// initialize
service.setOrderDAO(dao);
return service;
所以它本質上是一種實現良好分層和分離問題,即訪問數據庫的方式與您訪問數據的方式無關,以創建域模型,兩者都獨立於您在CustomerService
中執行的任何聚合或業務邏輯處理(此處未顯示簡潔)。
這是否更有意義?
它沒有什麼不對。 – bmargulies
我認爲這是有區別的 - 見下文。 – duffymo
我沒有說沒有區別。 – bmargulies