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


203

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

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

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

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

콩에.

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

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

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

답변:


279

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.


10
그리고 분명히 목록의 내용은 가치, 참고 문헌, 콩 등이 될 수 있습니다.
simonlord

멋진 대답은, 그것은 더 "봄처럼"의
jpaoletti

1
간단한 :<property name="beanList" ref="myList"/>
Manuel Spigolon

1
안녕하세요, 나는이 cvc-complex-type.2.4.c를 얻고 있습니다 : 일치하는 와일드 카드는 엄격하지만 'value'요소에 대한 선언을 찾을 수 없습니다. 나는 여전히 네임 스페이스와 schemaLocation을 추가했습니다
vishal

17
방금 @Autwired이런 식으로 만든 목록을 주입 할 때 도움 이 되지 않는 것으로 나타났습니다 . 그러나 @Resource작동합니다. 즉,@Resource List<String> myList
매트 프리드먼

173

한 가지 방법이 있습니다.

<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>

1
+1-나는 당신이 그렇게 할 수 있다는 것을 몰랐습니다. 제안 : 요소 가 필요하지 않도록 StageClass빈 선언 을 포함 할 수 있어야한다고 생각합니다 . <list><ref>
Stephen C

9
util : list를 사용하여 배열 목록을 제공 할 수도 있습니다
Richard

이러한 빈 정의를 "<list> </ list>"에 포함시킬 수 있습니까?
Sefler

예 @Sefler, 정의가 동일해야합니다
EIS

함정이 있습니다. @Autowired를 사용하는 경우, pojo가 "List"뿐만 아니라 "ArrayList"유형인지 확인하십시오. 그렇지 않으면 완전히 다른 것을 얻을 수 있습니다.
Tilman Hausherr

38

다른 옵션은 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();
}

34
<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;
    }

}

8

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

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

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


4

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

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


좋은 힌트이지만 작동하지 않습니다. stakker의 anwer는 효과가있었습니다. 힌트는 +1입니다.
guerda

2
 <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) :)


1

util 네임 스페이스를 사용하면 애플리케이션 컨텍스트에서 목록을 Bean으로 등록 할 수 있습니다. 그런 다음 목록을 재사용하여 다른 Bean 정의에 삽입 할 수 있습니다.


1

Jakub의 답변 외에도 JavaConfig를 사용하려는 경우 다음과 같은 방식으로 자동 연결을 수행 할 수도 있습니다.

import com.google.common.collect.Lists;

import java.util.List;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Bean;

<...>

@Configuration
public class MyConfiguration {

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

1

태그 id내부의 콩을 제거 하면 <list>됩니다. 이처럼 :

<property name="listStaff">
  <list>
    <bean class="com.test.entity.Staff">
        <constructor-arg name="name" value = "Jonh"/>
        <constructor-arg name="age" value = "30"/>
    </bean>
    <bean class="com.test.entity.Staff">
        <constructor-arg name="name" value = "Jam"/>
        <constructor-arg name="age" value = "21"/>
    </bean>
  </list>
</property>

0

그리고 이것은 Spring의 일부 속성에 set을 삽입하는 방법입니다.

<bean id="process"
      class="biz.bsoft.processing">
    <property name="stages">
        <set value-type="biz.bsoft.AbstractStage">
            <ref bean="stageReady"/>
            <ref bean="stageSteady"/>
            <ref bean="stageGo"/>
        </set>
    </property>
</bean>

0

문자열 목록을 삽입하십시오.

아래와 같이 문자열 목록을 취하는 국가 모델 클래스가 있다고 가정하십시오.

public class Countries {
    private List<String> countries;

    public List<String> getCountries() {
        return countries;
    }   

    public void setCountries(List<String> countries) {
        this.countries = countries;
    }

}

다음 xml 정의는 Bean을 정의하고 국가 목록을 삽입합니다.

<bean id="demoCountryCapitals" name="demoCountryCapitals" class="com.sample.pojo.Countries">
   <property name="countries">
      <list>
         <value>Iceland</value>
         <value>India</value>
         <value>Sri Lanka</value>
         <value>Russia</value>
      </list>
   </property>
</bean>

참조 링크

Pojos 목록 삽입

아래와 같은 모델 클래스가 있다고 가정하십시오.

public class Country {
    private String name;
    private String capital;
    .....
    .....
 }

public class Countries {
    private List<Country> favoriteCountries;

    public List<Country> getFavoriteCountries() {
        return favoriteCountries;
    }

    public void setFavoriteCountries(List<Country> favoriteCountries) {
        this.favoriteCountries = favoriteCountries;
    }

}

콩 정의.

 <bean id="india" class="com.sample.pojo.Country">
  <property name="name" value="India" />
  <property name="capital" value="New Delhi" />
 </bean>

 <bean id="russia" class="com.sample.pojo.Country">
  <property name="name" value="Russia" />
  <property name="capital" value="Moscow" />
 </bean>


 <bean id="demoCountryCapitals" name="demoCountryCapitals" class="com.sample.pojo.Countries">
  <property name="favoriteCountries">
   <list>
    <ref bean="india" />
    <ref bean="russia" />
   </list>
  </property>
 </bean>

참조 링크 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.