2012-10-11 54 views
7

Tôi đang làm việc trên một mã hiện có đang sử dụng một bộ điều khiển để gọi một phương thức trên bộ điều khiển thứ hai. Có 2 triển khai mà tôi đã thấy cho đến nay.Spring MVC, gọi bộ điều khiển khác từ Bên trong bộ điều khiển

1st Thực hiện

return new Controller().method(request, response); 

2 Thực hiện

@Autowired 
private Controller controller. 

return this.controller.method(request, response); 

Đó là việc thực hiện đúng, vấn đề là gì nếu bất kỳ với cả hai người.

+0

Ưu điểm của điều này là gì? Làm như vậy sẽ phá vỡ nhiều quy ước và bạn nên xem xét sửa đổi, tức là chia nhỏ mã bộ điều khiển và có thể di chuyển một số logic vào lớp nghiệp vụ. – dardo

Trả lời

9

Thực tế là bạn cần phải gọi một phương thức từ bộ điều khiển khác cho thấy một lỗ hổng thiết kế có thể xảy ra.

Với tùy chọn 1, bạn mất mọi thứ mà vùng chứa Spring DI mang đến cho bạn: cụ thể là, bộ điều khiển khác có thể được khởi tạo bởi Spring với một số phụ thuộc khác được nối vào nó. Nếu bạn tự khởi tạo nó, ngay cả khi nó hoạt động tại thời điểm này, bởi vì bạn có thể không có phụ thuộc @Autowired/@Value, nó sẽ phá vỡ khi bạn sẽ thêm phụ thuộc vào (các) tài nguyên khác. Bên cạnh đó, bạn đã có một trường hợp container được xây dựng cho bạn, tại sao tạo ra những người khác?

1

Việc đầu tiên cần nhiều công việc hơn, trước tiên bạn có thực sự muốn tạo một phiên bản mới của lớp Controller không?

Cách thứ hai sử dụng mẫu được gọi là tiêm phụ thuộc hoặc đảo ngược kiểm soát đẹp hơn. Hãy để mùa xuân quản lý phạm vi của bean cho bạn, theo mặc định nó sẽ tạo ra chỉ 1 instance của lớp Controller tuy nhiên nếu tại một số điểm (vì lý do nào đó) bạn không muốn hành vi này đơn giản để tạo ra nhiều cá thể ...

9

Có vẻ như bạn cần phải cấu trúc lại mã. Trích xuất những gì là phổ biến giữa hai bộ điều khiển vào một lớp riêng biệt, sau đó gọi đó từ một trong hai bộ điều khiển.

+2

+1 cho thực hành tốt, và để được từ Milwaukee, và về cơ bản nhắc lại bình luận của tôi. – dardo

4

Bạn đang làm sai hoàn toàn. Xem Costi Ciudatu's câu trả lời cho những gì là sai.

Giải pháp: Tôi khuyên bạn nên có service layer and dao layer classes được liên kết với controllers của bạn. Giả sử bạn có AccountController, bạn sẽ có AccountService lớp (giao diện + triển khai) và AccountDao (giao diện + triển khai).

Bây giờ nếu người dùng đăng nhập (LoginController) và bạn cần tài khoản, do đó bạn sẽ autowire AccountService trong LoginController, bạn sẽ nhận được thông tin tài khoản của người dùng từ AccountService phương pháp.

9

Nếu bạn thực hiện cuộc gọi giữa các Bộ điều khiển, có lỗi hoặc bạn muốn thực hiện chuyển hướng, điều này hoàn toàn hợp lệ. Nếu trường hợp chuyển hướng chỉ trở lại trong phương thức điều khiển của bạn như sau:

return "redirect:/yourDestinationControllerPath"; 
Các vấn đề liên quan