2013-02-04 43 views
7

Tôi đã gặp một tình huống như sau:Tham chiếu bean mùa xuân qua nhiều chủ đề

MyBean - Được định nghĩa trong Cấu hình XML.

Tôi cần phải tiêm MyBean vào nhiều luồng. Nhưng yêu cầu của tôi là: 1) Tham chiếu được truy xuất trong hai chủ đề khác nhau phải khác nhau 2) Nhưng tôi sẽ nhận được cùng một tham chiếu không phân biệt số lần tôi lấy đậu từ chuỗi đơn.

Ví dụ:

Thread1 { 

    run() { 
     MyBean obj1 = ctx.getBean("MyBean"); 
     ...... 
     ...... 
     MyBean obj2 = ctx.getBean("MyBean"); 
    } 
} 

Thread2 { 

    run(){ 
     MyBean obj3 = ctx.getBean("MyBean"); 
    } 
} 

Vì vậy, cơ bản obj1 == obj2 nhưng obj1 != obj3

Trả lời

10

Bạn có thể sử dụng phạm vi tùy chỉnh có tên SimpleThreadScope.

Từ các tài liệu Spring:

Tính đến Spring 3.0, một phạm vi chủ đề có sẵn, nhưng không được đăng ký theo mặc định. Để biết thêm thông tin, hãy xem tài liệu cho SimpleThreadScope. Để có hướng dẫn về cách đăng ký hoặc bất kỳ phạm vi tùy chỉnh nào khác, hãy xem Phần 3.5.5.2, “Using a custom scope”.

Dưới đây là một ví dụ về cách đăng ký phạm vi SimpleThreadScope:

Scope threadScope = new SimpleThreadScope(); 
beanFactory.registerScope("thread", threadScope); 

Sau đó, bạn sẽ có thể sử dụng nó trong định nghĩa của đậu của bạn:

<bean id="foo" class="foo.Bar" scope="thread"> 

Bạn cũng có thể làm đăng ký Phạm vi tuyên bố:

<?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:aop="http://www.springframework.org/schema/aop" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
      http://www.springframework.org/schema/aop 
      http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> 

    <bean class="org.springframework.beans.factory.config.CustomScopeConfigurer"> 
     <property name="scopes"> 
      <map> 
       <entry key="thread"> 
        <bean class="org.springframework.context.support.SimpleThreadScope"/> 
       </entry> 
      </map> 
     </property> 
    </bean> 

    <bean id="foo" class="foo.Bar" scope="thread"> 
     <property name="name" value="bar"/> 
    </bean> 

</beans> 
2

gì bạn cần là một Chủ đề mới tùy chỉnh Local phạm vi. Bạn có thể tự thực hiện hoặc use the one here của riêng mình.

Mô-đun phạm vi chủ đề tùy chỉnh là triển khai phạm vi tùy chỉnh cho cung cấp hạt tạp sợi. Mỗi yêu cầu cho một bean sẽ trả lại cùng một phiên bản cho cùng một chuỗi.

Các vấn đề liên quan