Java集合API的依赖注入

Java集合API的依赖注入,java,collections,dependency-injection,Java,Collections,Dependency Injection,我正在编写一个Java组件,它将在一些大数据上完成相当繁重的工作。因此,效率(速度和内存)显然至关重要 我也第一次开始使用IoC和依赖注入框架(如SpringAOP、GoogleGuice等),我想知道它们是否能帮到我 我想做的是这样的事情(在我的代码中): List mydata=newlist(); 然后,在某个XML配置文件中(或者无论框架如何配置注入),我将指定每次创建List实例时,注入(比如)一个ArrayList作为其实现 这样,如果以后我决定使用不同的实现,或者甚至是比Java

我正在编写一个Java组件,它将在一些大数据上完成相当繁重的工作。因此,效率(速度和内存)显然至关重要

我也第一次开始使用IoC和依赖注入框架(如SpringAOP、GoogleGuice等),我想知道它们是否能帮到我

我想做的是这样的事情(在我的代码中):

List mydata=newlist();
然后,在某个XML配置文件中(或者无论框架如何配置注入),我将指定每次创建List实例时,注入(比如)一个
ArrayList
作为其实现

这样,如果以后我决定使用不同的实现,或者甚至是比Java集合提供的任何东西更适合我的应用程序的国产实现,我只需要更改被注入的类。没有其他的修改是必要的,我的代码将运行得更有效率

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


提前感谢您提供的任何见解或建议

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

public static List<MyData> createDataList(){
    return new ArrayList<MyData>();
}
公共静态列表createDataList(){
返回新的ArrayList();
}
在所有应用程序中使用此工厂方法。现在,如果您想使用不同的列表实现,只需更改此方法。看,妈妈,不需要容器


我想说清楚:国际奥委会是一个很棒的概念。但我不认为你所说的是国际奥委会的经典场景。

这就是你想要的吗

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


这是spring的开箱即用…

您的目标是非常可能的,事实上这是一个很好的推荐实践,也称为依赖项注入

你可以用弹簧来做这个。当然,注入对象的确切语法将与您在这里展示的大不相同

例如,在春天,你会写

List MyData=factory.getBean(“MyData”)


在一个单独的配置文件中,您确切地指定了什么是
MyData
,这将被注入。

如前所述,您的案例描述对于DI解决方案来说有些不常规。特别是以这种方式调整性能有些不合适。我怀疑要在这方面取得真正的成功,您甚至需要在不同的注入位置使用多个实现。如果你想去,我建议使用。它允许在不同的情况下,只需几个绑定就可以绑定到不同的
列表
实现

然后,您可以使用IOC在运行时选择不同的工厂。好了,IOC是关于注入类的实例,而不是类本身,所以函数不会是静态的。@Chris使用不同工厂的方法当然是有效的,但可能不适用于像这样的基本任务。谢谢Sean!不过,我确实有一些预约。首先,尽管我还是一个相当新的企业开发人员,但我一次又一次地意识到工厂方法正在“退出”,因为它们很难测试,而dep注入是一种新的方式。你能不能快速解释一下为什么你认为国际奥委会是一个伟大的概念,但不适合这种情况?最后,我想要最好/最优雅的解决方案,因此我对任何一种方式(工厂或注射)都没有偏好,我只是好奇工厂和注射解决方案的不同场景。谢谢@没错,业务对象的工厂方法是邪恶的。但这是基础设施的东西,在这里,工厂方法是有效的,只要你保持它们简单和通用。如果让工厂方法返回依赖于数据库或任何其他外部先决条件的列表实现,那么我同意,IOC会更好。但如果您只是在试验集合类型,工厂方法应该足够了?归根结底,它们不都只是物体吗?我相信你是对的,我只是不理解ArrayList和应用服务器上浮动的bean之间的区别。再次感谢您迄今为止的帮助!
<util:list list-class="java.util.ArrayList" value-type="your.package.YourClass">
    <!-- list elements here -->
</util:list>