如何在Spring中使用占位符来处理对象列表

时间:2015-05-06 12:34:30

标签: java spring

我有一个对象,即Counter

public class Counter{
    private String counterGroup;
    private String counterName;
    private String counterValue;

    //getters & setters
}

public class Task{
    private String taskName;
    private List<Counter> counters;

    //getters & setters
}

在我的spring.xml中

<context:property-placeholder location="classpath:/test.properties"/>
<bean id="task" class="com.test.Task">
        <property name="taskName" value="${task.name}"/>
        <property name="counters">
        <list>
            <ref bean="counter1"/>
            <ref bean="counter2"/>
        </list>

</bean>

<bean id="counter1" class="com.test.Counter">
      <property name="counterGroup" value=${counter.group1}/>
      <property name="counterName" value=${counter.name1}/>
      <property name="counterValue" value=${counter.value1}/>
</bean>

<bean id="counter2" class="com.test.Counter">
      <property name="counterGroup" value=${counter.group2}/>
      <property name="counterName" value=${counter.name2}/>
      <property name="counterValue" value=${counter.value2}/>
</bean>

在test.properties

task.name=task1
counter.group1=g1
counter.name1=n1
counter.value1=v1
counter.group2=g2
counter.name2=n2
counter.value2=v2

如果我有更多的计数器,那么我必须编辑属性以及spring.xml文件。由于我是Spring和Java的新手,我不相信这是解决这个问题的正确方法。

任何人都可以提出不同的方法来解决同样的问题。

1 个答案:

答案 0 :(得分:1)

嗯,这可能是使用方法。但是,如果使用工厂方法和对象构建器,则可以使应用程序看起来更好。例如:

public class Counter {
    .......
    public static Counter createFor(String descriptor){
        String[] params = descriptor.split(":");
        return new Counter(params[0], params[1], params[2]);
    } 
}

你的背景:

<bean id="task" class="com.test.Task">
        <property name="taskName" value="${task.name}"/>
        <property name="counters">
        <list>
            <bean class="com.test.Counter" factoryMethod="createFor">
                 <constructor-arg ref="${counter.descriptor1}"/>
            </bean>
            <bean class="com.test.Counter" factoryMethod="createFor">
                 <constructor-arg ref="${counter.descriptor2}"/>
            </bean>
        </list>
</bean>

在test.properties

task.name=task1
counter.descriptor1=g1:n1:v1
counter.descriptor2=g2:n2:v2

当然,您不受此限制,可以升级或应用任何类似的设计技巧。