2009-06-16 21 views
7

Tôi muốn sử dụng @AutoWired để chèn một bean không được quản lý được định cấu hình với @Component vào một bean được quản lý. Tôi khá chắc chắn rằng tôi có cấu hình đúng, nhưng vì một lý do nào đó mà tôi tiếp tục bị ngoại lệ:Đậu không được quản lý tự động Chú thích với @Component

No unique bean of type [foo.Baz] is defined: Unsatisfied dependency of type [class foo.Baz]: expected at least 1 matching bean 

Dựa trên lỗi này, tôi đoán là không thể tìm thấy lớp Baz, nhưng tôi không chắc chắn lý do tại sao. Đó là sự hiểu biết của tôi rằng bối cảnh: yếu tố cấu hình mùa xuân trong cấu hình XML được cho là để cho phép tôi làm điều này. Tôi cũng đảm bảo bao gồm các tệp jar thích hợp (spring-woven.jar và aspectjweaver.jar).

Đây là một ví dụ đơn giản về thiết lập của tôi.

My XML config:

<beans ...> 
    ... 

    <context:annotation-config/> 
    <context:spring-configured/> 
    <context:component-scan base-package="foo"/> 

    <bean id="bar" class="foo.Bar"/> 
    ... 
</beans> 

Tôi đã một bean được quản lý:

package foo; 

public class Bar { 

    @Autowired 
    private Baz baz; 

    public void setBaz(Baz baz) { 
     this.baz = baz; 
    } 

    ... 
} 

Và một trong đậu không được quản lý:

package foo; 

@Component 
public class Baz { 
    ... 
} 

Có cái gì tôi đang thiếu?

EDIT: Nhật ký liệt kê các hạt của nó ngay lập tức và foo.Baz không phải là một trong số đó. Tôi không biết tại sao nó không chọn lớp được chú thích @Component.

+0

Ghi nhật ký nói gì? Có phải nó đề cập rằng nó là tự động phát hiện đậu trong gói foo? Việc ghi nhật ký gỡ lỗi sẽ cho biết các hạt @Component đã được tìm thấy. – skaffman

+0

Ngẫu nhiên, các công cụ được định cấu hình theo khía cạnh/dệt/lò xo không cần thiết cho những gì bạn muốn làm. Đây chỉ là autowiring cơ bản. – skaffman

Trả lời

11

Vì Thanh được định cấu hình bằng xml, nên chỉ có thể định cấu hình với xml. tức là bạn không thể trộn chúng. Vì vậy, chú thích "@Autowired" trên Baz không được chọn (không có chú thích nào). Chỉ khi bạn thêm chú thích mùa xuân ở cấp lớp, mùa xuân sẽ nghe bất kỳ chú thích nào khác.

Những gì bạn cần làm là xml định cấu hình đậu được loại bỏ theo loại, thêm bộ đặt cho loại đó và bạn sẽ đạt được hành vi mong muốn.

<bean id="bar" class="foo.Bar" autowire="byType"/> 

Một điều nữa, khi bạn chú thích một bean với @Component nó một lò xo được quản lý đậu. Chỉ vì nó không được tạo ra với xml không có nghĩa là nó không được quản lý. Một bean không được quản lý là một bean bạn không nhận được từ mùa xuân.

Bar và Baz đều là mùa xuân được quản lý. Đó là cơ chế bạn đã chọn để xác định chúng khác nhau.

+0

Một sự hiểu lầm hoàn toàn về thuật ngữ về phía tôi. Câu trả lời chính xác. Cảm ơn! –

+3

Bạn có thể kết hợp xml và cấu hình chú thích. – banterCZ

+0

@banterCZ yes ... Tôi đã nhận thấy rằng bây giờ –

6

Phản hồi trước đó không chính xác, theo một khía cạnh. Bạn có thể autowire bean được cấu hình bằng xml.

Từ phần 3.4.5 trong http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html:

Khi sử dụng dựa trên XML cấu hình siêu dữ liệu [2], bạn chỉ định autowire chế độ cho một định nghĩa bean với các thuộc tính autowire của nguyên tố này. Chức năng autowiring có năm chế độ. Bạn chỉ định autowiring cho mỗi bean và do đó có thể chọn cái nào để autowire.

Bạn có thể tự động theo tên, loại và hàm tạo. Có một ví dụ thô về điều này ở đây: http://www.java2s.com/Code/Java/Spring/AutoWiring.htm

-2

Lỗi là do trình tự các hạt được xác định trong tệp cấu hình XML của bạn.

Như trên tệp XML của bạn, bean cho bar được tạo trước và sau đó là các hạt phụ thuộc của chúng do đó @Autowired không thể tìm thấy baz.

Trước tiên, bạn phải khai báo đậu cho baz và sau đó cho bar.

+0

Trong cấu hình xml tất cả các bean có thể được khai báo ở bất kỳ đâu, thứ tự không liên quan. –

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