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);
}
}
순서를 유지하는 다른 솔루션은 @Order
Bean에 주석을 사용하는 것 입니다. 그런 다음 목록에는 오름차순 주석 값으로 정렬 된 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
속성을 제공하십시오 . 그런 다음 선언 id
을 ref
다른 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) 🙂