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);
}
}
순서를 유지하는 다른 솔루션은 @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 {
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
'IT story' 카테고리의 다른 글
현재 디렉토리의 전체 경로를 얻는 Windows 셸 명령? (0) | 2020.05.11 |
---|---|
Docker Compose를 사용하는 대화식 쉘 (0) | 2020.05.11 |
문자열 날짜를 NSDate로 변환하려면 어떻게해야합니까? (0) | 2020.05.11 |
iPhone 6 및 6 Plus에서 앱의 기본 해상도를 활성화하는 방법은 무엇입니까? (0) | 2020.05.11 |
NoClassDefFoundError-Eclipse 및 Android (0) | 2020.05.11 |