Как определить бин List весной?
Я использую Spring для определения этапов в моем приложении. Настроен тот необходимый класс (здесь называется Configurator
) вводится с этапами.
Теперь мне нужен список этапов в другом классе с именем LoginBean
, Configurator
не предлагает доступ к своему списку этапов.
Я не могу изменить класс Configurator
,
Моя идея:
Определите новый бин с именем Stages и добавьте его в Configurator
а также LoginBean
, Моя проблема с этой идеей состоит в том, что я не знаю, как преобразовать это свойство:
<property ...>
<list>
<bean ... >...</bean>
<bean ... >...</bean>
<bean ... >...</bean>
</list>
</property>
в боб.
Как то так не работает
<bean id="stages" class="java.util.ArrayList">
Кто-нибудь может мне помочь с этим?
13 ответов
Импортируйте пространство имен 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>
Тип-значения - это общий тип, который будет использоваться, и является необязательным. Вы также можете указать класс реализации списка, используя атрибут 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>
<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;
}
}
Другой вариант - использовать 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
@Order(1)
public Stage stage1() {
return new Stage1();
}
@Bean
@Order(2)
public Stage stage2() {
return new Stage2();
}
Stacker дал отличный ответ, я бы пошел еще дальше, чтобы сделать его более динамичным и использовать 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>
элемент как его значение, и дать бину id
приписывать. Затем каждый раз, когда вы используете id
как ref
или подобное в некотором другом объявлении бина, создается новая копия списка. Вы также можете указать List
класс для использования.
Вставить список строк.
Предположим, у вас есть класс модели стран, который принимает список строк, как показано ниже.
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>
Ссылка на ссылку.
<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) впоследствии:)
Вы просто удаляете 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>
В дополнение к ответу Якуба, если вы планируете использовать 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);
}
}
Используйте пространство имен util, вы сможете зарегистрировать список как компонент в контексте вашего приложения. Затем вы можете повторно использовать список, чтобы добавить его в другие определения bean-компонентов.
Используйте атрибут list-class в util: list, чтобы создать автономный список любого конкретного типа. например, если вы хотите составить список типа ArrayList:
<util:list id="namesList" list-class="java.util.ArrayList" value-type="java.lang.String">
<value>Abhay</value>
<value>ankit</value>
<value>Akshansh</value>
<value>Db</value>
</util:list>
или если вы хотите создать список типа LinkedList, тогда:
<util:list id="namesList" list-class="java.util.LinkedList" value-type="java.lang.String">
<value>Abhay</value>
<value>ankit</value>
<value>Akshansh</value>
<value>Db</value>
</util:list>
И вот как вставить множество в какое-то свойство в 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>