2015-04-02 14 views
12

tôi đang học Spring MVC và tôi có những nghi ngờ sau:Cách hoạt động chính xác phạm vi phiên Spring của bean? phạm vi mặc định của một bean trong ngữ cảnh web là gì?

  1. gì chính xác là mục đích của phạm vi phiên?

Đọc tài liệu Tôi biết rằng phạm vi này định nghĩa bean cho phiên HTTP. Chỉ hợp lệ trong ngữ cảnh của Spring ApplicationContext nhận biết web. Và cũng có thể một phiên bản mới được tạo một lần cho mỗi phiên người dùng.

Nhưng khi nào nó được sử dụng chính xác? và vì mục đích gì? Bạn có thể làm một ví dụ thực tế?

  1. Trong Spring MVC là gì phạm vi mặc định trong bối cảnh web?

Tôi biết rằng trong mùa xuân phạm vi mặc định cho một bean là singleton nhưng những gì về phạm vi của một bean trong bối cảnh web?

+1

Có vẻ như bạn biết câu trả lời. Việc tiêm một bean vào một ngữ cảnh web không thay đổi phạm vi mặc định của nó. Phạm vi một bean để phiên là một cách thuận tiện để lưu trữ nhà nước có liên quan đến một phiên người dùng cụ thể. Bạn kết thúc với một phiên bản mỗi phiên. Sau đây là một ví dụ, nơi tôi sử dụng nó để khởi tạo một phiên Drools dài chạy cho mỗi người dùng: https://github.com/gratiartis/qzr/blob/master/qzr-web/src/main/java/com/ sctrcd/qzr/services/HrMaxQuizService.java – Steve

+0

@Steve Tnx nhưng nếu tôi thực sự biết câu trả lời tôi không hỏi nó. Ít nhất tôi có thể có một ý tưởng về những gì có thể xảy ra nhưng tôi không chắc chắn về nó bởi vì tôi đang nghiên cứu nó và tôi không có kinh nghiệm thực nghiệm – AndreaNobili

Trả lời

8

Ans 1) phạm vi phiên rất giống với phạm vi HttpSession. Đậu được khởi tạo dựa trên phạm vi phiên phạm vi cuộc sống thông qua phiên HTTP. Tương tự như phạm vi yêu cầu, nó chỉ áp dụng cho các bối cảnh ứng dụng mùa xuân nhận thức web.

/** * Annotation-based configuration of session scope */ 
@Component 
@Scope("session") 
public class ShopCart { } 

và sau đó

@Inject 
private ShopCart cart; 

Ans 2) Mặc định là Singleton ở khắp mọi nơi.

10
  1. Bạn sử dụng hạt đậu mùa xuân cho các loại đậu có trạng thái và trạng thái của chúng khác nhau cho mỗi người dùng. Đây có thể là ví dụ về sở thích của người dùng hiện đang đăng nhập.
  2. Phạm vi mặc định của đậu vào mùa xuân là singleton và không khác gì trong ngữ cảnh Ứng dụng web.

Lưu ý rằng trong môi trường web, bạn cũng có thể sử dụng REQUEST hạt tạp và tuổi thọ của chúng chỉ theo một yêu cầu của người dùng. Bạn nên sử dụng phạm vi yêu cầu khi phiên không cần thiết và yêu cầu là đủ.

Ngoài ra, trong môi trường portlet, bạn có thể sử dụng một phạm vi khác là PHIÊN TOÀN CẦU. Mỗi portlet có phiên riêng của nó và thường những portlet này được preffered để có trạng thái riêng của chúng chỉ được đóng gói cho chính chúng. Nhưng nếu bạn cần chia sẻ dữ liệu phiên giữa các portlet khác nhau, bạn sẽ cần sử dụng phạm vi phiên chung.

8

Trên thực tế mùa xuân giúp bạn tạo phiên phạm vi đậu thay vì cách truyền thống

httpSession.setAttribute("Object",new Object()); 
&& 
httpSession.getAttribute("Object"); 

và Spring cung cấp theo cách này hiệu quả

@Component 
@Scope("session") 
public class Foo{ 
} 

bây giờ nó đau đầu của mùa xuân để tạo ra và tiêu diệt đối tượng session liên quan này sử dụng Nhà máy Pattern

2

Tôi đã gặp vấn đề tương tự, tôi đã sử dụng:

@Component 
@Scope("session") 

Và điều này làm cho sự kỳ diệu đối với tôi:

@Component 
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS) 

Tôi hy vọng nó giúp ;-)

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