क्या गैर-सिंगलटन (उदा। सत्र-स्कोप्ड) बीन के साथ स्प्रिंग के @Cacheable
एनोटेशन का उपयोग करने का कोई आसान तरीका है और क्या कैश के समान बीप कहा गया है?क्या वसंत की @ कैशेबल एनोटेशन में एनोटेटेड विधि के बीन के समान स्कोप हो सकता है?
उदाहरण:
import javax.inject.Inject;
import javax.inject.Named;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.context.annotation.Scope;
import org.springframework.security.core.context.SecurityContextHolder;
@Named
@Scope("session")
public class UserNameRetriever {
@Inject private UserDao userDao;
@Cacheable("userName")
public String getUserName() {
return userDao.getUserByLogin((String)SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getName();
}
}
आदर्श रूप में, UserNameRetriever.getUserName()
UserDao
प्रति सत्र एक बार से उपयोगकर्ता नाम लाने होगा, लेकिन इस कोड को वास्तव में आवेदन चौड़ा संचित करता है।
यह काम करता है, लेकिन बिना ( \t \ @CacheEvict (मूल्य = "उपयोगकर्ता नाम" एक स्मृति रिसाव, कुंजी = "# root.target" है) \t \ @PreDestroy \t सार्वजनिक शून्य सफाई() { \t} ) इसके अलावा, मैंने निर्णय लिया है कि @Cacheable का उपयोग न करें, क्योंकि यह गारंटी नहीं देता है कि मान केवल एक बार गणना की जाएगी। –
स्मृति रिसाव से आपका क्या मतलब है? शायद आपका कैश बहुत बड़ा है। @ कैशेबल पहले कैश में लुकअप करेगा, इसलिए यह गारंटी देता है कि कैश में अभी भी मान की गणना नहीं की जाएगी। – sinuhepop
यह एक स्मृति रिसाव है क्योंकि सत्र समाप्त होने के बाद, मान अभी भी कैश में है, लेकिन इसका उपयोग नहीं किया जा सकता है। @PreDestroy यह सुनिश्चित करता है कि सत्र समाप्त होने पर कैश किए गए मान को निकाल दिया जाए। –