2012-01-15 26 views
7

Trong ứng dụng của tôi Tôi đang sử dụng một hạt User được Tự động dịch vụ MyService và được sử dụng làm nguyên tắc đăng nhập vào thông tin của người dùng (Vì vậy, người dùng không đến như một hạt tĩnh từ một xml nhưng được tạo động từ người dùng đã đăng nhập) Nếu có mười người dùng đã đăng nhập, tôi sẽ có mười ứng cử viên cho trường @AutoWiredUser. (phải không?) và tôi có thể nhận được bất kỳ một trong số họ cos AutoWired trông trong thùng chứa mùa xuân và không phiên.Spring @Autowired confused (vùng chứa hoặc phiên)

cho tôi biết nếu tôi sai về vấn đề này. và cách thực sự giải quyết nó nếu có thể. Nhưng nếu lĩnh vực AutoWired tôi được chú thích với @Scope ("Session")

Như thế này:

@Component("user") 
@Scope("session") 
public class User 
{ 
String userid; 
String name; 
//getter setters etc 
} 

@Component 
public class MyService 
{ 
    @Autowired 
    private User user; 

} 

Có thể lấy đậu tài khoản của một số người dùng khác khi tôi gọi MyService phần của tôi. Cos MyService chỉ là @Component mặc dù User@Scope(session).

Về cơ bản, (Nếu tôi sai trong giả định của tôi) Tôi nghĩ rằng khi bạn @Autowire một trường, giao diện của nó nhìn vào vùng chứa như toàn bộ và vùng chứa không được chia thành các nhà chứa phụ trên mỗi phiên.

Trả lời

11

Khi bạn chú thích User với @Scope("session") và sau đó @Autowire đó vào một thành phần phi scoped, mùa xuân sẽ tạo ra một proxy mà nằm giữa MyServiceUser. Proxy này sẽ xác định vị trí User từ phiên hiện tại và sẽ ủy quyền bất kỳ cuộc gọi nào từ MyService đến proxy tới số phiên User phiên.

Vì vậy, nó hoàn toàn an toàn, thành phần MyService sẽ chỉ có quyền truy cập vào số User từ phiên hiện tại.

Nếu proxy không xảy ra, khi đó vùng chứa sẽ không khởi động được, vì bạn không thể đưa trực tiếp một bean có phạm vi phiên vào bean đơn phủ.

+0

Vì vậy, không thể khi tôi thực hiện 'SpringUtils.getContext (req) .getBean (" myservice ")', tôi sẽ nhận được một số bean người dùng khác không có trong phiên hiện tại. – sarmahdi

+1

@sarmahdi: Đúng vậy. Phiên của người dùng hiện tại là biến chủ đề cục bộ được Spring duy trì. – skaffman

+0

Vì vậy, nó không thể khi tôi làm một 'SpringUtils.getContext (req) .getBean (" myservice ")', tôi sẽ nhận được một số bean người dùng khác không có trong phiên hiện tại. Thực ra tôi gặp vấn đề này khi tôi tải một trang và tôi có một số chi tiết người dùng khác. Vì vậy, tôi đã nghĩ rằng nó có thể là cos ngay cả khi người dùng là phiên scoped dịch vụ không phải là và không scoped là mặc định singelton. – sarmahdi

11

Mùa xuân sẽ không tự động tạo proxy. Bạn cần thay đổi chú thích phạm vi của bạn như sau

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

Điều này sẽ đảm bảo rằng khi các session bean là nhận autowired trong một lớp singleton, một proxy được tạo ra xung quanh đậu đó sẽ chịu trách nhiệm để có được đậu từ phiên.

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