Với
@Controller
public class MyController {
@RequestMapping(value = "/index")
public String respond() {
return "index";
}
}
mùa xuân sẽ tạo ra một thể hiện của MyController
. Điều này là do Spring phân tích cú pháp cấu hình của bạn, <mvc:annotation-driven>
, xem @Controller
(giống như @Component
) và khởi tạo lớp chú thích. Bởi vì nó thấy @RequestMapping
là tốt, nó tạo ra một HandlerMapping
cho nó, xem docs here.
Mọi yêu cầu HTTP mà DispatcherServlet
nhận sẽ được gửi đến trường hợp bộ điều khiển này qua HandlerMapping
đã đăng ký trước đó, gọi respond()
thông qua phản ánh java trên trường hợp đó.
Nếu bạn có instance fields như
@Controller
public class MyController {
private int count = 0;
@RequestMapping(value = "/index")
public String respond() {
count++;
return "index";
}
}
count
sẽ là một mối nguy hiểm, bởi vì nó có thể được sửa đổi bởi nhiều chủ đề và thay đổi nó có thể bị mất.
Bạn cần hiểu cách các vùng chứa Servlet hoạt động. Vùng chứa này thể hiện một phiên bản của Spring MVC DispatcherServlet
của bạn. Container cũng quản lý một nhóm các Threads mà nó sử dụng để trả lời các kết nối, ví dụ. Yêu cầu HTTP. Khi một yêu cầu đến, container chọn một Thread từ pool và, trong Thread đó, thực thi phương thức service()
trên DispatcherServlet
gửi đến đúng @Controller
instance mà Spring đã đăng ký cho bạn (từ cấu hình của bạn).
Vì vậy, các lớp học Spring MVC phải là chủ đề an toàn. Bạn có thể làm điều này bằng cách chơi với các phạm vi khác nhau cho các trường thể hiện lớp của bạn hoặc thay vào đó chỉ có các biến cục bộ. Nếu không, bạn sẽ cần phải thêm đồng bộ hóa thích hợp xung quanh các phần quan trọng trong mã của bạn.
Nguồn
2013-05-28 15:13:44
Về chỉnh sửa. Spring sẽ gọi cùng một phương thức trên cùng một cá thể lớp '@ Controller' cho một yêu cầu với cùng một định dạng được yêu cầu bởi' @ RequestMapping'. –