2015-09-17 19 views
10

Tôi đã xem mọi nơi trực tuyến để có câu trả lời đơn giản cho câu hỏi trên và không thể tìm thấy câu trả lời đó. Tôi có một phương pháp như:Spring's @Cacheable làm gì khi được đặt trên một phương thức trả về một danh sách?

@Cacheable(cacheNames = "objects") 
public List<Object> get() { .. } 

Tôi đang sử dụng ehcache 2.10.0 với Spring Framework 4.2.1, và tôi có thể nhìn thấy đầu ra sau đây cho phương pháp này:

Adding cacheable method 'get' with attribute: [CacheableOperation[public java.util.List com.example.DAO.get()] caches=[objects] | key='' ... 

cũng (ở sau khai thác gỗ)

Computed cache key 'SimpleKey []' for operation ... 

chú thích @Cacheable phải để làm trong tình huống này là gì? Đặt mỗi đối tượng trong bộ nhớ đệm được khóa bởi hashCode (như được gợi ý ở nơi khác)? Hoặc chỉ cần plonk toàn bộ danh sách như là-vào bộ nhớ cache theo một số hashCode dựa trên danh sách?

Trả lời

8

Các mùa xuân Doc đề cập đến điều này:

Kể từ khi bộ nhớ đệm cơ bản là các cửa hàng trọng điểm có giá trị, mỗi lời gọi của một phương pháp lưu trữ cần phải được dịch ra tiếng một chìa khóa phù hợp cho bộ nhớ cache truy cập. Ra khỏi hộp, các bộ nhớ đệm trừu tượng sử dụng một KeyGenerator đơn giản dựa trên các thuật toán sau đây:

  • Nếu không params được đưa ra, trở về 0

  • Nếu chỉ có một thông số được đưa ra, trả về trường hợp đó

  • Nếu có thêm một tham số, trả về một khóa được tính từ các băm của tất cả các tham số.

http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/html/cache.html

Khi bạn chú thích nó với @Cacheable(cacheNames = "objects") bạn cung cấp cho nó một cái tên bộ nhớ cache dựa vào đó nó có thể xác định bộ nhớ cache. Vì phương thức của bạn không có bất kỳ đối số nào, đối với tên bộ nhớ cache là "đối tượng", nó sẽ lưu trữ đối tượng trả về (List<Object> trong trường hợp này). và mỗi khi phương thức được gọi, nó sẽ kiểm tra bộ nhớ cache với đối tượng cacheName và với giá trị khóa là '0'. Nếu nó đã có một đối tượng trả về được lưu trữ trước đó, nó sẽ trả về đối tượng.

+0

Vì vậy, nó sẽ trả về toàn bộ danh sách trên lần gọi thứ hai của phương thức get()? – ben3000

+0

Có thể. Vì nó đã có một bản ghi rằng phương thức đã được thi hành nên đối tượng được lưu trữ. Xin lưu ý rằng phương pháp của bạn phải được công khai để làm việc. –

+1

Các đối tượng riêng lẻ trong danh sách có được lưu trong các khóa riêng biệt không? – ben3000

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