[java] Spring에서 List Bean을 정의하는 방법은 무엇입니까?

Spring을 사용하여 응용 프로그램에서 단계를 정의하고 있습니다. 필요한 클래스 (여기서 Configurator)에 스테이지가 주입되도록 구성되었습니다.
이제라는 다른 클래스의 스테이지 목록이 필요합니다 LoginBean. 는 Configurator단계의 자신의 목록에 대한 액세스를 제공하지 않습니다.

수업을 변경할 수 없습니다 Configurator.

내 아이디어 :
새로운 콩라는 단계를 정의하고 그것을 주입 Configurator하고 LoginBean. 이 아이디어의 내 문제는이 속성을 변환하는 방법을 모른다는 것입니다.

<property ...>
  <list>
    <bean ... >...</bean>
    <bean ... >...</bean>
    <bean ... >...</bean>
  </list>
</property>

콩에.

이와 같은 것이 작동하지 않습니다.

<bean id="stages" class="java.util.ArrayList">

아무도 나를 도울 수 있습니까?



답변

spring util 네임 스페이스를 가져옵니다. 그런 다음 다음과 같이 목록 Bean을 정의 할 수 있습니다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                    http://www.springframework.org/schema/util
                    http://www.springframework.org/schema/util/spring-util-2.5.xsd">


<util:list id="myList" value-type="java.lang.String">
    <value>foo</value>
    <value>bar</value>
</util:list>

value-type은 사용할 제네릭 형식이며 선택 사항입니다. 속성을 사용하여 목록 구현 클래스를 지정할 수도 있습니다 list-class.


답변

한 가지 방법이 있습니다.

<bean id="stage1" class="Stageclass"/>
<bean id="stage2" class="Stageclass"/>

<bean id="stages" class="java.util.ArrayList">
    <constructor-arg>
        <list>
            <ref bean="stage1" />
            <ref bean="stage2" />
        </list>
    </constructor-arg>
</bean>


답변

다른 옵션은 JavaConfig를 사용하는 것입니다. 모든 단계가 이미 봄 콩으로 등록되어 있다고 가정하면 다음을 수행해야합니다.

@Autowired
private List<Stage> stages;

스프링은 자동으로이 목록에 삽입합니다. 순서를 유지 해야하는 경우 (위 솔루션은 그렇지 않음) 다음과 같이 할 수 있습니다.

@Configuration
public class MyConfiguration {
  @Autowired
  private Stage1 stage1;

  @Autowired
  private Stage2 stage2;

  @Bean
  public List<Stage> stages() {
    return Lists.newArrayList(stage1, stage2);
  }
}

순서를 유지하는 다른 솔루션은 @OrderBean에 주석을 사용하는 것 입니다. 그런 다음 목록에는 오름차순 주석 값으로 정렬 된 Bean이 포함됩니다.

@Bean
@Order(1)
public Stage stage1() {
    return new Stage1();
}

@Bean
@Order(2)
public Stage stage2() {
    return new Stage2();
}


답변

<bean id="someBean"
      class="com.somePackage.SomeClass">
    <property name="myList">
        <list value-type="com.somePackage.TypeForList">
            <ref bean="someBeanInTheList"/>
            <ref bean="someOtherBeanInTheList"/>
            <ref bean="someThirdBeanInTheList"/>
        </list>
    </property>
</bean>

그리고 SomeClass에서 :

class SomeClass {

    List<TypeForList> myList;

    @Required
    public void setMyList(List<TypeForList> myList) {
        this.myList = myList;
    }

}


답변

스태커는 큰 대답을했으며, 한 걸음 더 나아가서 더 역동적으로 만들고 Spring 3 EL Expression을 사용할 것입니다.

<bean id="listBean" class="java.util.ArrayList">
        <constructor-arg>
            <value>#{springDAOBean.getGenericListFoo()}</value>
        </constructor-arg>
</bean>

util : list 로이 작업을 수행하는 방법을 알아 내려고했지만 변환 오류로 인해 작동하지 못했습니다.


답변

나는 당신이 찾고 있다고 생각합니다 org.springframework.beans.factory.config.ListFactoryBean.

ListFactoryBean 인스턴스를 선언하여 <list>요소를 값 으로 사용하여 특성으로 인스턴스화 할 목록을 제공하고 Bean에 id속성을 제공하십시오 . 그런 다음 선언 idref다른 Bean 선언에서 또는 이와 유사한 것으로 사용할 때마다 목록의 새 사본이 인스턴스화됩니다. List사용할 클래스를 지정할 수도 있습니다.


답변

 <bean id="student1" class="com.spring.assin2.Student">
<property name="name" value="ram"></property>
<property name="id" value="1"></property>
<property name="listTest">
        <list value-type="java.util.List">
            <ref bean="test1"/>
            <ref bean="test2"/>
        </list>
    </property>
</bean>  

그 빈을 정의하십시오 (test1, test2) 🙂