2011-09-20 31 views
2

我正在编写一个Java组件,它将对一些大数据执行相当繁重的工作。因此,显然,效率(速度和记忆)是最重要的。我也刚开始第一次使用IoC和依赖注入框架(比如Spring AOP,Google Guice等),并且想知道他们是否可以帮我解决问题。Java Collections API上的依赖注入

我希望做的是这样的(全部在我的代码):

List<MyData> oMyData = new List<MyData>(); 

然后,在一些XML配置文件(或不过框架配置注射),我会规定每个在创建List的实例时,要注入一个ArrayList<MyData>作为它的实现。通过这种方式,如果我决定使用不同的实现,或者甚至是比本地应用更适合我的应用的东西,那么它比Java Collections提供的任何东西都更有效,所以我只需要更改被注入的类。没有其他修改是必要的,我的代码将更有效地运行。

这是一个可能的解决方案,还是这只是大梦?再说一遍,因为我对IoC框架是如此的陌生,很难分辨注入哪些对象会起作用,在注入过程中是否可以保留泛型以及其他各种复杂的细节,我似乎无法在其他任何地方找到答案。

在此先感谢您的任何见解或建议!

回答

3

这听起来不像IOC容器的经典场景,但您可以使用工厂方法。

public static List<MyData> createDataList(){ 
    return new ArrayList<MyData>(); 
} 

在您的应用程序中使用此工厂方法。现在,如果您想使用不同的列表实现,只需更改此方法即可。看妈妈,不需要容器。

要明确:国际奥委会是一个很棒的概念。但我不认为你在谈论的是国际奥委会的典型场景。

+0

然后从这里开始,您可以使用IOC在运行时选择不同的工厂。 AFAIK,IOC是关于注入类的实例,而不是类本身,所以函数不会是静态的。 – Chris

+0

@Chris不同工厂的方法当然是有效的,但可能不适合像这样的基本任务。 –

+0

谢谢肖恩!我确实有几个保留。首先,虽然我还是一个相当新的企业开发人员,但它一次又一次地被我打败,因为工厂方法很难进行测试,因此很难进行测试。注射是新的途径。你能否迅速解释为什么你认为国际奥委会是一个伟大的理念,但不是为了这个场景?在这一天结束时,我想要最好的/最优雅的解决方案,所以我没有任何偏好(工厂或注入),我只是好奇哪些场景需要工厂与注入解决方案。谢谢! – IAmYourFaja

1

这是你在找什么?

<util:list list-class="java.util.ArrayList" value-type="your.package.YourClass"> 
    <!-- list elements here --> 
</util:list> 

这出来的最有弹簧箱...

0

什么你的目标是非常可能的,实际上是一个很好的建议的做法,也被称为依赖注入。

你可以用Spring来做这个。当然,注入对象的确切语法将与你在这里显示的有很大不同。

春季,例如,你会写

List<MyData> oMyData = factory.getBean("MyData")

在一个单独的配置文件,您可以指定到底是什么MyData,而这将让注入。

0

如前所述,您的案例描述对于DI解决方案来说有点不合常规。特别是要调整这种方式的表现有些不合适。我怀疑在这方面确实取得成功,你甚至需要针对不同的注射地点实施多个实施。如果你想去那,我建议使用Silk DI。它允许绑定到不同情况下的不同List实现http://www.silkdi.com/userguide/binds.html#targeting只需几个绑定。