2013-08-30 45 views
10

Mỗi tài liệu Spring 3, The IoC container, chú thích @Named là tiêu chuẩn tương đương với chú thích @Component.Chú thích @Nam trong Spring MVC

Kể từ @Repository, @Service, và @Controller đều @Component, tôi đã cố gắng để sử dụng @Named cho tất cả chúng trong ứng dụng Spring MVC của tôi. Nó hoạt động tốt. Nhưng tôi thấy sự thay thế của @Controller dường như có một lỗi. Trong lớp trình điều khiển, ban đầu, nó là

@Controller 
public class MyController{ 
    ... 
} 

Nó hoạt động tốt. Khi tôi thay đổi @Controller để @Named

@Named 
public class MyController{ 
    ... 
} 

Nó thất bại với lỗi:

"No mapping found for HTTP request with URI ...".

Nhưng nếu tôi thêm @RequestMapping đến lớp như sau

@Named 
@RequestMapping 
public class MyController{ 
    ... 
} 

Nó sẽ làm việc như mong đợi.

Đối với @Repository@Service, tôi có thể chỉ cần thay thế chúng bằng @Named mà không có vấn đề gì. Nhưng việc thay thế @Controller cần thêm công việc. Có điều gì tôi thiếu trong cấu hình không?

Trả lời

16

@Named hoạt động giống như @Component. Tuy nhiên, chú thích @Controller, @Service@Repository cụ thể hơn.

Từ mùa xuân docs:

@Component is a generic stereotype for any Spring-managed component. @Repository , @Service , and @Controller are specializations of @Component for more specific use cases, for example, in the persistence, service, and presentation layers, respectively.

For example, these stereotype annotations make ideal targets for pointcuts. It is also possible that @Repository , @Service , and @Controller may carry additional semantics in future releases of the Spring Framework. Thus, if you are choosing between using @Component or @Service for your service layer, @Service is clearly the better choice. Similarly, as stated above, @Repository is already supported as a marker for automatic exception translation in your persistence layer.

This phần giải thích sự khác biệt với @Named.

Nhiều thành phần, như Spring DispatcherServlet (Cấu hình MVC trong WebApplicationContext) không tìm kiếm Component, họ đang tìm kiếm @Controller. Vì vậy, khi nó quét lớp học của bạn, nó sẽ không tìm thấy nó trong @Named. Theo cách tương tự, quản lý giao dịch với @Transactional tìm kiếm @Service@Repository, không dành cho @Component chung chung hơn.

+0

Liệu nó có nghĩa là tôi có thể yên tâm sử dụng '@ Named' để thay thế '@ Component' thành tiêm bean chung, nhưng tôi vẫn cần sử dụng' @ Repository', '@ Service' và' @ Controller' trong các tính năng cụ thể của Spring MVC? –

+0

@dino Bạn được chào đón. Cân nhắc chấp nhận câu trả lời này trừ khi bạn muốn đợi thêm câu trả lời với các chi tiết khác. –

3

Tất cả @Repository, @Service@Controller chủ yếu là cho tuyên bố đậu mùa xuân, ngoài ra nó cung cấp thông tin thêm để mùa xuân về loại đậu như bộ điều khiển, dao vv

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