2009-02-10 86 views
16

依赖注入是否意味着你不需要'new'关键字?或者是否有理由直接创建简单的叶类,如集合?在使用依赖注入时,有没有'新'的情况?

在下面我的例子中注入比较,查询和DAO,但SortedSet的直接实例:

public Iterable<Employee> getRecentHires() 
{ 
    SortedSet<Employee> entries = new TreeSet<Employee>(comparator); 
    entries.addAll(employeeDao.findAll(query)); 
    return entries; 
} 

回答

9

只是因为依赖注入是一个有用的模式并不意味着我们使用它的一切。即使在使用DI时,通常也需要新的。不要删除新的。

0

是的,当然。

依赖注入意味着可能有几个可能的实例化目标,其中客户端可能不知道(或能够做出选择)的编译时间。

但是,有足够的情况下确实知道要实例化的内容,因此不需要DI。

这就像在面向对象的语言中调用函数一样:只是因为你可以使用动态绑定,并不意味着你不能使用良好的旧静态分派(例如,当你的方法分成几个私有操作)。

4

使用与您的代码片段中显示的一样没有任何问题。

考虑想要追加字符串片段的情况。为什么你想要问一个StringBuilder的注入器?

在我面对的另一种情况下,我需要根据容器的生命周期运行一个线程。在这种情况下,我必须执行新线程(),因为我的Injector是在调用容器启动的回调方法之后创建的。一旦注入器准备好了,我就会手动注入一些托管类到我的Thread子类中。

6

我通常决定是否使用依赖注入的一种方式是在编写测​​试类的单元测试时是否需要模拟或者删除协作类。例如,在你的例子中,你正确地注入了DAO,因为如果你为你的类写了一个单元测试,你可能不希望任何数据被真正写入数据库。或者也许是一个协作类将文件写入文件系统或依赖于外部资源。或者单元测试中的行为是不可预测或难以解释的。在这些情况下,最好注入这些依赖关系。

对于像TreeSet这样的协作类,我通常不会注入这些类,因为通常不需要模拟这些简单的类。

最后一个注意事项:当某个字段无论何种原因无法注入时,但我仍然想在测试中嘲笑它,我发现Junit-addons PrivateAccessor类有助于将该类的专用字段切换为模拟由EasyMock创建的对象(或者jMock或其他任何你喜欢的模拟框架)。

+0

Spring还拥有用于私有成员操作的`ReflectionTestUtils`类。 – 2013-05-21 09:19:23

0

我的想法是,DI是非常棒的,非常适合连线层,而且您的代码片段也需要灵活应对潜在的变化。当然,我们可以说一切都可能需要改变,但我们都知道在实践中有些东西不会被触及。

所以当DI过度杀伤我使用'新',只是让它滚动。例如:对于我将模型连接到视图到控制器层,它总是通过DI来完成的。我的应用使用的任何算法,DI以及任何可插入反射代码DI。数据库层.. DI,但几乎任何其他在我的系统中使用的对象都是用一个通用的'new'来处理的。

希望这有助于。

0

确实,在当今,框架驱动的环境中,您实例化对象的次数越来越少。例如,Servlet通过servlet容器实例化,Spring中的bean实例化为Spring等。

尽管如此,当使用持久层时,您将在持久化对象被实例化之前对其进行实例化。例如,在使用Hibernate时,在调用HibernateTemplate上的保存之前,您将在持久化对象上调用new。

相关问题