这是一个奇怪的例子,但第一个演示什么是依赖注入容器会做和第二个演示一个对象传递一个参数到另一个对象。第一个嵌入它的依赖作为调用类的实例变量;第二个更具程序性。 本身也不是。这取决于你的依赖有多复杂,以及你想如何管理代码。
只看你提供的注射器代码,为什么你想要使用依赖注入并不明显。但暂时考虑一个更复杂(更典型)的例子。
的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