Java Spring IOC 构造函数参数注入(inject)一个 List<Integer>

标签 java spring inversion-of-control constructor-injection

我正在尝试开发一个像这样的Spring bean

<bean id="id" class="java.util.ArrayList" scope='prototype'>
    <constructor-arg>
        <list>
            <bean class='MyClass'>
                <property name='id' value='1313'/>
                <property name="name" value='John Lennon'/>
                <property name='wifes'>                        
                    <list>
                        <bean class="WifeClazz">
                            <constructor-arg index='0' value='Cynthia Lennon'/>
                            <constructor-arg index='1'>                                    
                                <list><value>1962</value><value>1968</value></list>
                            </constructor-arg>
                        </bean>                 
                    </list>                 
                </property>
            </bean>             
        </list>
    </constructor-arg>
</bean>        

这只是一个示例,WifeClazz 名称只是为了示例..有一个构造函数,其中包含一个字符串和一系列整数..像这个示例

new WifeClazz("Cinthia Lennon",java.util.Arrays.asList(1,2,3,4,5,6,7,8));

整数可以是1到10之间的多个整数。

但我认为这样做有点烦人

<constructor-arg index='1'>                                    
      <list>
          <value>1</value>
          <value>2</value>
          <value>3</value>
          <value>4</value> 
      </list>
 </constructor-arg>

如果我能做这样的事情那就太好了

  <constructor-arg index='1'>
       <value>#{T(java.util.Arrays).asList(1,2,3,4)}</value>
  </constructor-arg>

但抛出异常有任何线索吗?

非常感谢任何帮助。

更新

我已经根据 Edwin 更改了我的代码,如下所示。

<constructor-arg index="1" type="java.util.Collection" value="#{T(java.util.Arrays).asList(1,2,3,4,5)}"/>

但是抛出

Caused by: java.lang.IllegalArgumentException: Final expected argument should be array type (the varargs parameter)

我的目标是

public MyClass(final String name,final List<Integer>years){}

我的结果代码

<bean id="id" class="java.util.ArrayList" scope='prototype'>
<constructor-arg>
    <list>
        <bean class='MyClass'>
            <property name='id' value='1313'/>
            <property name="name" value='John Lennon'/>
            <property name='wifes'>                        
                <list>
                    <bean class="WifeClazz">
                        <constructor-arg index='0' value='Cynthia Lennon'/>
                        <constructor-arg index="1" type="java.util.Collection" value="#{T(java.util.Arrays).asList(1,2,3,4,5)}"/>
                    </bean>                 
                </list>                 
            </property>
        </bean>             
    </list>
</constructor-arg>
</bean>        

这解决了这个问题...

<constructor-arg index='1' type="java.util.List" value="#{{1,2,3,4,5}}"/>

最佳答案

这对我有用

<bean id="list" class="java.util.ArrayList">
 <constructor-arg index="0" value="#{T(java.util.Arrays).asList(1,2,3,4,5)}"/>
</bean>

为了消除构造函数的歧义,这对我也适用

<bean id="list" class="java.util.ArrayList">
    <constructor-arg type="java.util.Collection" value="#{T(java.util.Arrays).asList(1,2,3,4,5)}"/>
</bean>

您还可以像这样使用集合 SPeL,并避免直接使用 Arrays.asList。

<bean id="list" class="java.util.ArrayList">
    <constructor-arg type="java.util.Collection" value="#{{1,2,3,4,5}}"/>
</bean>

关于Java Spring IOC 构造函数参数注入(inject)一个 List<Integer>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26047783/

相关文章:

inversion-of-control - Unity 是否可以直接创建类而不需要注册任何东西?

java - iPOJO : identifier uniqueness namespace for @Publishes and @Subscriber

java - 为什么 LinkedHashSet<E> 扩展 HashSet<e> 并实现 Set<E>

java - 一种重置 Spring Integration 上下文中所有消息的方法

java - 在 Android 中将对象转换为 JSON

java - 将 @CrossOrigin 与旧注释一起使用

c# - 良好的设计 DDD 和 IoC,如何将 IRepository 注入(inject)模型

java - 如何在 Zip writer 中使用进度条?

Spring Data MongoDB Reactive - 处理大量文档的 findAll?

spring - 动态上下文 - Autowiring