2012-03-22 2 views
10

Tôi đã một lớp có tên Bar với chú thích như sau: @Configurable(autowire = Autowire.BY_TYPE)Xuân autowire và nguyên mẫu phạm vi

Trên một thành viên tin tôi có chú thích như sau:

@Autowired(required = true) 
private Foo foo; 

Trong cấu hình mùa xuân Tôi có một bean của lớp Foo. Nếu đậu được định nghĩa với scope="prototype" nó không hoạt động và tôi nhận được ngoại lệ sau đây:

NoSuchBeanDefinitionException: Không đậu kết hợp của loại Foo tìm thấy cho sự phụ thuộc: dự kiến ​​ít nhất 1 đậu mà đủ điều kiện như autowire ứng cử viên cho việc này phụ thuộc

Khi tôi thay đổi phạm vi đậu được tiêm thành "singleton" hoạt động tốt.

Không phải là dây tự động của đậu phạm vi mẫu thử nghiệm được phép?

Có cách giải quyết nào khác (bên cạnh nhận đậu theo cách thủ công) không?

Cảm ơn trước, Avner

+0

Liên quan: http://stackoverflow.com/questions/27776672/spring-protype-scope-behaviour/27782040#27782040 –

Trả lời

9

Các liên kết sau đây cung cấp các giải pháp thay thế cho các kịch bản như:

  1. http://whyjava.wordpress.com/2010/10/30/spring-scoped-proxy-beans-an-alternative-to-method-injection/
  2. http://benkiew.wordpress.com/2012/04/22/spring-2-5-x-create-prototype-instances-from-code/

Các cuộc đàm phán liên kết đầu tiên về việc thêm để Foo:

@Component 
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS, value = "prototype") 
class Foo 

nào sẽ gây ra một ví dụ mới mỗi cuộc gọi.

+0

Thật tuyệt khi bạn viết, nhưng sẽ tốt hơn nếu bạn chỉ viết rằng cấu hình với proxy là bắt buộc :) – tomekK

+0

Chỉ có câu trả lời liên kết là xấu, điều gì sẽ xảy ra nếu liên kết đã biến mất? –

-1

Nếu phạm vi đậu tiêm là 'Singleton', cùng một ví dụ của bean sẽ được tự động có dây. Nếu phạm vi đậu tiêm là 'nguyên mẫu', cá thể mới sẽ được tạo ra như là một phần của quá trình tự động dây.

Phiên bản Spring nào bạn đang sử dụng và cũng đính kèm tệp spring-context.xml để biết thêm chi tiết.

+1

Tôi biết sự khác biệt giữa nguyên mẫu và singleton, tôi chỉ không hiểu tại sao nên phạm vi đậu có ảnh hưởng đến việc tự động nối dây. Tôi đang sử dụng mùa xuân 3. –

0

Tôi tin rằng nguyên mẫu/vật đơn được khai báo trong xml của bạn cho hạt đó là vấn đề.

Không phải là dây tự động của đậu phạm vi nguyên mẫu được phép không?

Tôi nghĩ rằng nó không được phép. Logic là nếu nó được cho phép, sau đó bất cứ khi nào bạn sử dụng lớp đó, thì nó cần phải phục hồi lại rằng bean luôn luôn là trường của nó. Mà là kỳ lạ đặc biệt là nếu các lớp đậu này được autowired như một lĩnh vực là một singleton chính nó.

có cách nào khác (bên cạnh việc nhận đậu theo cách thủ công) không?

Chỉ cần cố gắng loại bỏ thuộc tính phạm vi, gây ra nếu thuộc tính nguyên mẫu, nó sẽ không được truy lục. Nếu những bean (dịch vụ và DAO) được khai báo trong applicationContext của bạn, chỉ cần để chú thích autowire nhận được nó như singleton vì các bean mặc định là singleton, mà nó nên là.

+0

Cảm ơn câu trả lời của bạn nhưng việc loại bỏ thuộc tính scope sẽ không sửa mã của tôi vì tất cả các cá thể Bar sẽ chia sẻ cùng một cá thể Foo không phải là thứ tôi cần. Trong trường hợp Foo bổ sung nên được instantiated một lần cho mỗi sáng tạo/tiêm đối tượng Bar và không phải cho mỗi trường sử dụng (theo như sự hiểu biết của tôi). –

+0

tôi không biết nếu có một thay thế cho thiết kế cụ thể của bạn, cho tôi biết nếu có. Tuy nhiên, theo như thiết kế có liên quan, đậu nên được sử dụng theo cách không quốc tịch, nó có nghĩa là cẩn thận trong các lĩnh vực của bạn, đảm bảo các trường sử dụng trong các hạt đó không phải là trường toàn cục mà là các trường phương thức, theo cách này thậm chí là singleton của nó Đừng lo lắng nếu nó được chia sẻ bởi nhiều lớp vì không có biến toàn cầu nào được chia sẻ, bởi vì nó là không trạng thái. – vine

-2

hoặc bạn chỉ cần sử dụng toán tử mới.

+1

Điều đó hoàn toàn đánh bại toàn bộ mục đích của DI và IOC. – csmckelvey