İlkbaharda bir Liste fasulyesi nasıl tanımlanır?


203

Uygulamamdaki aşamaları tanımlamak için Spring kullanıyorum. Gerekli sınıfa (burada denir Configurator) aşamalarla enjekte edilecek şekilde yapılandırılmıştır .
Şimdi adı verilen başka bir sınıftaki Aşama Listesine ihtiyacım var LoginBean. ConfiguratorAşamalarında onun Listesine erişimi sunmamaktadır.

Sınıfı değiştiremem Configurator.

Benim Fikir:
Yeni bir fasulye denilen Aşamaları tanımlayın ve bunu enjekte Configuratorve LoginBean. Bu fikir ile benim sorunum bu özelliği dönüştürmek için nasıl bilmiyorum:

<property ...>
  <list>
    <bean ... >...</bean>
    <bean ... >...</bean>
    <bean ... >...</bean>
  </list>
</property>

bir fasulye içine.

Böyle bir şey işe yaramıyor:

<bean id="stages" class="java.util.ArrayList">

Biri bana bu konuda yardımcı olabilir mi?

Yanıtlar:


279

Spring util ad alanını içe aktarın. Daha sonra bir liste fasulyesini aşağıdaki gibi tanımlayabilirsiniz:

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

Değer türü kullanılacak jenerik tipidir ve isteğe bağlıdır. Özniteliği kullanarak liste uygulama sınıfını da belirtebilirsiniz list-class.


10
ve açıkçası listenin içeriği değerler, referanslar ve fasulye vb olabilir.
simonlord

Harika cevap, daha fazla "bahar gibi"
jpaoletti

1
basit:<property name="beanList" ref="myList"/>
Manuel Spigolon

1
Merhaba bu cvc-complex-type.2.4.c alıyorum: Eşleşen joker karakter katı, ancak 'değer' öğesi için hiçbir bildirim bulunamadı. İsim alanı ve şema ekledim
Konum

17
Ben sadece @Autwiredbu şekilde oluşturulan bir liste enjekte ederken yardımcı olmadığını fark ettim . Ancak @Resourceçalışır. yani@Resource List<String> myList
Matt Friedman

173

İşte bir yöntem:

<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 - Bunu yapabileceğini bilmiyordum (işe yarayacağını görebiliyorum). Öneri: Bence StageClassfasulye beyanlarını elementlere <list>olan ihtiyacı ortadan kaldırarak yerleştirebilmelisiniz <ref>.
Stephen C

9
ayrıca bir arraylist vermek için util: list kullanabilirsiniz
Richard

Bu fasulye tanımlarını "<list> </list>" içine gömmek mümkün müdür?
Sefler

@Sefler evet, tanımlar orada aynı olmalı
eis

Bir tuzak var: @Autowired kullanıyorsanız, pojo'nuzun sadece "Liste" değil, "ArrayList" türünde olduğundan emin olun veya tamamen farklı bir şey alabilirsiniz.
Tilman Hausherr

38

Başka bir seçenek JavaConfig kullanmaktır. Tüm aşamaların zaten bahar fasulyesi olarak kayıtlı olduğunu varsayarsak:

@Autowired
private List<Stage> stages;

ve yay otomatik olarak bu listeye enjekte edilir. Siparişi korumanız gerekiyorsa (üst çözüm bunu yapmaz) bunu şu şekilde yapabilirsiniz:

@Configuration
public class MyConfiguration {
  @Autowired
  private Stage1 stage1;

  @Autowired
  private Stage2 stage2;

  @Bean
  public List<Stage> stages() {
    return Lists.newArrayList(stage1, stage2);
  }
}

Siparişi korumak için diğer çözüm @Orderfasulye üzerinde bir açıklama kullanmaktır . Daha sonra liste, ek açıklama değerine göre sıralanan fasulye içerecektir.

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

Ve SomeClass'ta:

class SomeClass {

    List<TypeForList> myList;

    @Required
    public void setMyList(List<TypeForList> myList) {
        this.myList = myList;
    }

}

8

İstifleyici harika bir cevap verdi, daha dinamik hale getirmek ve Spring 3 EL Expression kullanmak için bir adım daha ileri giderdim.

<bean id="listBean" class="java.util.ArrayList">
        <constructor-arg>
            <value>#{springDAOBean.getGenericListFoo()}</value>
        </constructor-arg>
</bean>

Bunu util: list ile nasıl yapabilirim anlamaya çalışıyordum ama dönüşüm hataları nedeniyle işe yaramadı.


4

Sanırım arıyor olabilirsiniz org.springframework.beans.factory.config.ListFactoryBean.

Listenin bir <list>öğe değerine sahip bir özellik olarak somutlaştırılmasını sağlayarak ve bir idözniteliğe bir öznitelik verirken bir ListFactoryBean örneği bildirirsiniz . Ardından, bildirimi diğer bazı fasulye bildirimlerinde veya benzeri idolarak her kullandığınızda ref, listenin yeni bir kopyası başlatılır. ListKullanılacak sınıfı da belirleyebilirsiniz .


Güzel bir ipucu, ama işe yaramıyor. stakker'ın anwerı çalıştı. İpucu için +1.
gerilla

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>  

daha sonra bu fasulyeleri (test1, test2) tanımlayınız :)


1

Util ad alanını kullanın, listeyi uygulama bağlamınızda bir fasulye olarak kaydedebileceksiniz. Daha sonra listeyi diğer fasulye tanımlarına enjekte etmek için yeniden kullanabilirsiniz.


1

Jakub'ın cevabına ek olarak, JavaConfig'i kullanmayı planlıyorsanız, bu şekilde otomatik olarak da bağlanabilirsiniz:

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

Sadece etiketin idiçindeki fasülyeleri çıkarın <list>. Bunun gibi:

<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

Ve ilkbaharda bazı mülklerde setin nasıl enjekte edildiği:

<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

Dizelerin listesini enjekte edin.

Aşağıdaki gibi dizeleri listeleyen Ülkeler model sınıfınız olduğunu varsayalım.

public class Countries {
    private List<String> countries;

    public List<String> getCountries() {
        return countries;
    }   

    public void setCountries(List<String> countries) {
        this.countries = countries;
    }

}

Aşağıdaki xml tanımını bir fasulye tanımlayın ve ülkelerin listesini enjekte edin.

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

Referans bağlantısı

Pojos listesini enjekte et

Aşağıdaki gibi model sınıfınız varsa varsayalım.

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

}

Fasulye Tanımları.

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

Referans Bağlantısı .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.