Làm thế nào để xác định một danh sách bean trong mùa xuân?


203

Tôi đang sử dụng Spring để xác định các giai đoạn trong ứng dụng của mình. Nó được cấu hình rằng lớp cần thiết (ở đây được gọi là Configurator) được thêm vào các giai đoạn.
Bây giờ tôi cần Danh sách các giai đoạn trong một lớp khác, được đặt tên LoginBean. Các Configuratorkhông cung cấp quyền truy cập vào danh sách của ông giai đoạn.

Tôi không thể thay đổi lớp học Configurator.

Ý tưởng của tôi:
Xác định một loại đậu mới có tên là Stages và tiêm nó vào ConfiguratorLoginBean. Vấn đề của tôi với ý tưởng này là tôi không biết cách chuyển đổi thuộc tính này:

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

thành một hạt đậu.

Một cái gì đó như thế này không hoạt động:

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

Ai có thể giúp tôi với điều này?

Câu trả lời:


279

Nhập không gian tên sử dụng mùa xuân. Sau đó, bạn có thể định nghĩa một bean danh sách như sau:

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

Loại giá trị là loại tổng quát được sử dụng và là tùy chọn. Bạn cũng có thể chỉ định lớp thực hiện danh sách bằng cách sử dụng thuộc tính list-class.


10
và rõ ràng nội dung của danh sách có thể là các giá trị, tài liệu tham khảo và đậu, v.v.
simonlord

Câu trả lời tuyệt vời, đó là "giống như mùa xuân"
jpaoletti

1
đơn giản:<property name="beanList" ref="myList"/>
Manuel Spigolon 17/03/2016

1
Xin chào Tôi đang nhận cvc-phức-type.2.4.c này: Ký tự đại diện phù hợp là nghiêm ngặt, nhưng không thể tìm thấy khai báo nào cho phần tử 'value'. Tôi đã thêm không gian tên và lược đồLocation
vishal

17
Tôi chỉ nhận thấy rằng @Autwiredkhông có ích khi tiêm một danh sách được tạo theo cách này. Tuy nhiên, @Resourcecông trình. tức là@Resource List<String> myList
Matt Friedman

173

Đây là một phương pháp:

<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 - Tôi không biết bạn có thể làm điều đó (mặc dù tôi có thể thấy rằng nó sẽ hoạt động). Gợi ý: Tôi nghĩ bạn sẽ có thể nhúng các StageClasskhai báo bean <list>để tránh sự cần thiết cho các <ref>yếu tố.
Stephen C

9
bạn cũng có thể sử dụng tiện ích: danh sách để cung cấp cho bạn một danh sách mảng
Richard

Có thể nhúng các định nghĩa bean vào "<list> </ list>" không?
Sefler

@Sefler có, các định nghĩa nên giống hệt nhau ở đó
eis

Có một điều đáng tiếc: nếu sử dụng @Autowired, hãy đảm bảo rằng pojo của bạn cũng thuộc loại "ArrayList" chứ không chỉ là "Danh sách" hoặc bạn có thể nhận được một cái gì đó hoàn toàn khác.
Tilman Hausherr

38

Một tùy chọn khác là sử dụng JavaConfig. Giả sử rằng tất cả các giai đoạn đã được đăng ký là đậu mùa xuân, bạn chỉ cần:

@Autowired
private List<Stage> stages;

và mùa xuân sẽ tự động tiêm chúng vào danh sách này. Nếu bạn cần giữ trật tự (giải pháp trên không làm điều đó), bạn có thể làm theo cách đó:

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

  @Autowired
  private Stage2 stage2;

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

Giải pháp khác để giữ trật tự là sử dụng @Orderchú thích trên đậu. Sau đó, danh sách sẽ chứa các hạt được sắp xếp theo giá trị chú thích tăng dần.

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

Và trong someClass:

class SomeClass {

    List<TypeForList> myList;

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

}

8

Stacker đã đặt ra một câu trả lời tuyệt vời, tôi sẽ đi xa hơn một bước để làm cho nó năng động hơn và sử dụng Biểu thức EL 3 của Spring.

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

Tôi đã cố gắng tìm hiểu làm thế nào tôi có thể làm điều này với danh sách tiện ích: nhưng không thể làm cho nó hoạt động được do lỗi chuyển đổi.


4

Tôi nghĩ rằng bạn có thể đang tìm kiếm org.springframework.beans.factory.config.ListFactoryBean.

Bạn khai báo một cá thể ListFactoryBean, cung cấp danh sách được khởi tạo như một thuộc tính với một <list>phần tử là giá trị của nó và cung cấp cho bean một idthuộc tính. Sau đó, mỗi lần bạn sử dụng khai báo idlà một refhoặc tương tự trong một số khai báo bean khác, một bản sao mới của danh sách sẽ được khởi tạo. Bạn cũng có thể chỉ định Listlớp sẽ được sử dụng.


Đó là một gợi ý hay, nhưng tôi không làm cho nó hoạt động. stwerer anwer làm việc. +1 cho gợi ý.
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>  

định nghĩa các bean đó (test1, test2) sau đó :)


1

Sử dụng không gian tên produc, bạn sẽ có thể đăng ký danh sách dưới dạng bean trong ngữ cảnh ứng dụng của bạn. Sau đó, bạn có thể sử dụng lại danh sách để đưa nó vào các định nghĩa đậu khác.


1

Ngoài câu trả lời của Jakub, nếu bạn dự định sử dụng JavaConfig, bạn cũng có thể tự động theo cách đó:

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

Bạn chỉ cần loại bỏ idđậu bên trong <list>thẻ. Như thế này:

<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

Và đây là cách tiêm set trong một số tài sản trong 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>

0

Tiêm danh sách các chuỗi.

Giả sử bạn có lớp mô hình Quốc gia có danh sách các chuỗi như bên dưới.

public class Countries {
    private List<String> countries;

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

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

}

Theo định nghĩa xml định nghĩa một danh sách các quốc gia đậu và tiêm.

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

Liên kết tham khảo

Tiêm danh sách Pojos

Giả sử nếu bạn có lớp mô hình như dưới đây.

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 định nghĩa.

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

Liên kết tham khảo .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.