2015-05-11 16 views
7

Tôi đang cố gắng tìm ra phạm vi của một bean theo tên của nó.Làm thế nào để lập trình xác định phạm vi của một bean

Những gì tôi tìm thấy cho đến nay là:

BeanFactory#isPrototype(String name) 
      #isSingleton(String name) 

Trong trường hợp của tôi, tôi muốn tìm hiểu nếu đậu là trong phạm vi yêu cầu. Có một số phương pháp nội bộ trong khung công tác Spring mà tôi có thể sử dụng, nhưng tôi tự hỏi liệu có một cách thích hợp để thực hiện nó hay không.

+0

Đây chỉ là phỏng đoán nhưng vì mã ứng dụng thông thường không được biết về phạm vi, có thể những phương pháp nội bộ đó là lựa chọn duy nhất của bạn. – biziclop

+0

Bạn không cần phải khám phá nó khi chạy. Bạn là nhà thiết kế của ứng dụng. Bạn nên *** đã biết rồi. – EJP

+1

@EJP Trong trường hợp của tôi, ở nơi tôi cần biết, tôi không biết. Nếu tôi biết tôi sẽ không hỏi. – Sandro

Trả lời

4

Câu hỏi hay.

Không có phương pháp isRequst() trong BeanFactory vì phạm vi yêu cầu chỉ liên quan đến web.

Tôi vừa cố gắng tìm cách để thực hiện việc này và không thành công. Vì vậy, tôi có thể đề xuất bạn làm việc xung quanh sẽ hoạt động nếu bạn đang sử dụng chú thích. Khi bạn nhận được cá thể đậu nói bean.getClass().getAnnotation(Scope.class). Nếu điều này trả về Scope, hãy gọi value().

Đây không phải là phương pháp "khoa học", nhưng hy vọng đủ tốt cho bạn.

EDIT

Cách tiếp cận khác là như sau. Bean phạm vi yêu cầu được lưu trữ trong thuộc tính yêu cầu. Tôi không nhớ tên của nó bây giờ nhưng bạn có thể dễ dàng tìm thấy nó cho mình, chỉ cần kiểm tra yêu cầu của bạn trong trình gỡ lỗi. Sau đó kiểm tra tham chiếu đến bean của bạn ở đó. Phương pháp này có lẽ tốt hơn nhưng đòi hỏi một số nỗ lực để điều tra thuộc tính yêu cầu và cấu trúc dữ liệu được sử dụng bởi khung công tác Spring.

1

Các giải pháp sau đây sẽ làm việc cho trường hợp của ConfigurableApplicationContext:

import org.springframework.beans.factory.config.BeanDefinition; 
import org.springframework.context.ConfigurableApplicationContext; 

public String getScope(ConfigurableApplicationContext context, String sourceBean) { 
    BeanDefinition beanDefinition = context.getBeanFactory().getMergedBeanDefinition(sourceBean); 
    return beanDefinition.getScope(); 
} 

Bằng cách tham khảo ý kiến ​​BeanDefinition s, giải pháp này cũng sẽ làm việc cho phạm vi đậu tùy chỉnh.

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