Як визначити список квасолі навесні?


203

Я використовую 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">

Хтось може мені допомогти в цьому?

Відповіді:


279

Імпортуйте простір імен джерела утиліти. Тоді ви можете визначити список бобів таким чином:

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


10
і очевидно, що вміст списку може бути значеннями, посиланнями та квасолею тощо.
simonlord

Чудова відповідь, це більш "
весняноподібно

1
простий:<property name="beanList" ref="myList"/>
Мануель Спіголон

1
Привіт, я отримую цей cvc-complex-type.2.4.c: відповідний підстановочний номер є суворим, але декларація не може бути знайдена для елемента "значення". Я додав простір імен та
схему Розташування

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>елементах.
Стівен С

9
ви також можете скористатись util: list, щоб дати вам архівників
Річард

Чи можна вбудувати ці визначення бобів у "<список> </list>"?
Сефлер

@Sefler так, визначення повинні бути ідентичні там
ейс

Існує невдача: якщо ви користуєтесь @Autowired, переконайтеся, що ваш pojo також має тип "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);
  }
}

Іншим рішенням для збереження порядку є використання @Orderанотації на квасолі. Тоді список містить боби, упорядковані за зростанням значення анотації.

@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

Stacker поставив чудову відповідь, я б пішов на крок далі, щоб зробити це більш динамічним і використовувати 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>елемент як його значення, і надаєте idатрибуту bean . Потім, кожного разу, коли ви використовуєте оголошений idяк refподібний у якійсь іншій заяві про боби, нова копія списку створюється миттєво. Ви також можете вказати Listклас, який буде використовуватися.


Це приємний натяк, але я не вважаю, що це працює. Стаккерський анвер працював. +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>  

визначте ці боби (тест1, тест2) після цього :)


1

Використовуючи простір імен утиліти, ви зможете зареєструвати список як боб у вашому контексті програми. Потім ви можете повторно використовувати список, щоб ввести його в інші визначення квасолі.


1

Як додаток до відповіді Якуба, якщо ви плануєте використовувати 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

Ось як ввести весну в якусь властивість навесні:

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

Посилання Посилання .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.