nhiều gói trong ngữ cảnh: quét thành phần, cấu hình mùa xuân


185

Làm cách nào tôi có thể thêm nhiều gói trong tệp spring-servlet.xml trong context:component-scanphần tử?

Tôi đã thử

<context:component-scan base-package="z.y.z.service" base-package="x.y.z.controller" />

<context:component-scan base-package="x.y.z.service, x.y.z.controller" />

<context:component-scan base-package="x.y.z.service" />
<context:component-scan base-package="x.y.z.controller" />

nhưng có lỗi:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [x.y.z.dao.daoservice.LoginDAO] found for dependency:

Câu trả lời:


271

Cách tiếp cận sau đây là đúng:

<context:component-scan base-package="x.y.z.service, x.y.z.controller" /> 

Lưu ý rằng lỗi khiếu nại x.y.z.dao.daoservice.LoginDAO, không có trong các gói được đề cập ở trên, có lẽ bạn đã quên thêm nó:

<context:component-scan base-package="x.y.z.service, x.y.z.controller, x.y.z.dao" /> 

5
Câu trả lời này ngụ ý rằng KHÔNG có đệ quy cho các thành viên của gói cơ sở NHƯNG CÓ: stackoverflow.com/questions/7774295/ Lỗi . Tôi sẽ đề nghị thay đổi câu trả lời một chút để làm rõ điều này.
djangofan


43

Bạn có thể thêm nhiều gói cơ sở (xem câu trả lời của axtavt ), nhưng bạn cũng có thể lọc những gì được quét bên trong gói cơ sở:

<context:component-scan base-package="x.y.z">
   <context:include-filter type="regex" expression="(service|controller)\..*"/>
</context:component-scan>

2
@shams không cần phải nói với tôi, nhưng nếu câu trả lời là chính xác, bạn nên đánh dấu nó là được chấp nhận (nhấp vào dấu kiểm)
Sean Patrick Floyd

1
Tại sao bạn không thể thêm nhiều gói cơ sở? Ví dụ như "org.example, com.example"?
Shervin Asgari

@Shervin bạn có thể. chính xác như bạn đã viết "Ngoài ra, bạn có thể chỉ định danh sách được phân tách bằng dấu phẩy bao gồm gói cha của mỗi lớp." (cũng xem câu trả lời dự kiến)
Sean Patrick Floyd

19
<context:component-scan base-package="x.y.z"/>

sẽ hoạt động vì các gói còn lại là các gói phụ của "xyz". Vì vậy, bạn không cần phải đề cập đến từng gói riêng lẻ.


2
Đồng ý! Có lẽ đó là một lý do khác, nhưng điều này chỉ không phù hợp với tôi với mvc mùa xuân cho các portlet ...
elcadro

@elcadro phải thông qua các lý do khác, vì đây là tính năng được quảng cáo và ghi chép tốt
eis 23/11/13

Chà, tôi không thể nói ngược lại vì nhiều người đang sửa lỗi cho tôi. Tôi ước tôi có thể tìm thấy lý do tại sao điều này không làm việc cho tôi ... Dù sao cũng cảm ơn!
elcadro

Liệu nó có đúng ngay cả đối với cấu hình dựa trên chú thích?
Nikhil Sahu

6

Một cách tiếp cận chú thích chung khác:

@ComponentScan(basePackages = {"x.y.z"})

2

Nếu xyz là gói phổ biến thì bạn có thể sử dụng:

<context:component-scan base-package="x.y.z.*">

nó sẽ bao gồm tất cả các gói bắt đầu với xyz như: xyzcontroll, xyzservice, v.v.


1

Ví dụ: bạn có gói "com.abc" và bạn có nhiều gói bên trong nó, Bạn có thể sử dụng như

@ComponentScan("com.abc")

0

Một phản hồi chậm nhưng để cung cấp nhiều gói sử dụng phương pháp tiếp cận dựa trên chú thích, chúng ta có thể sử dụng như sau:

@ComponentScan({"com.my.package.one","com.my.package.subpackage.two","com.your.package.supersubpackage.two"})

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.