IT story

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

hot-time 2020. 5. 11. 08:06
반응형

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 {

    private 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 로이 작업을 수행하는 방법을 알아 내려고했지만 변환 오류로 인해 작동하지 못했습니다.


I think you may be looking for org.springframework.beans.factory.config.ListFactoryBean.

You declare a ListFactoryBean instance, providing the list to be instantiated as a property withe a <list> element as its value, and give the bean an id attribute. Then, each time you use the declared id as a ref or similar in some other bean declaration, a new copy of the list is instantiated. You can also specify the List class to be used.


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

define those beans(test1,test2) afterwards :)


Use the util namespace, you will be able to register the list as a bean in your application context. You can then reuse the list to inject it in other bean definitions.


As an addition to Jakub's answer, if you plan to use JavaConfig, you can also autowire that way:

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

You just remove id out of beans inside <list> tag. Like this:

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

And this is how to inject set in some property in Spring:

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

참고URL : https://stackoverflow.com/questions/2416056/how-to-define-a-list-bean-in-spring

반응형