2012-04-27 12 views
13

के माध्यम से Google guava कैश बिल्डर को बीन में इंजेक्शन देना कोई भी Spring xml के माध्यम से एक निर्भर बीन में Google guava के CacheBuilder को बनाने और इंजेक्ट करने के लिए एक अच्छा स्निपेट प्रदान कर सकता है?स्प्रिंग

सामान्यीकृत करने के लिए, मुझे Spring में कुछ उदाहरणों की आवश्यकता है जो बिल्डर पैटर्न का उपयोग करके वस्तुओं के निर्माण को दर्शाती हैं।

उत्तर

10

हालांकि call arbitrary methods in Spring XML using the factory-method attribute पर यह संभव है, आप पाएंगे कि बिल्डर-पैटर्न शैली की जंजीर कॉल के लिए यह असंभव है।

इसके बजाय, ऐसे जटिल परिदृश्यों के लिए FactoryBean या Java-based container configuration का उपयोग करें। एक्सएमएल आपको अब तक नहीं मिलेगा, मुझे डर है।

+0

धन्यवाद - मुझे फैक्टरीबीन के माध्यम से चल रहा है! – kuriouscoder

+0

@kuriouscoder क्या आप अपना स्निपेट साझा कर सकते हैं, मैं एक ही नाव में हूं, धन्यवाद! –

+0

यदि आप जावा कॉन्फ़िगरेशन का उपयोग करना पसंद करते हैं तो इस प्रश्न पर एक पूर्ण उदाहरण है: http://stackoverflow.com/questions/8181768/can-i-set-a-ttl-for-cacheable/31926759#31926759 – anataliocs

18
(जारी 12) अगले अमरूद रिलीज में CacheBuilderSpec के अलावा, आप, एक्सएमएल में एक CacheBuilder सेम बनाने के लिए CacheBuilder.from(String spec) स्थिर कारखाने विधि का उपयोग कर सकेंगे के साथ

यह इस तरह दिखेगा:

<bean id="legendaryCacheBuilder" 
     class="com.google.common.cache.CacheBuilder" 
     factory-method="from"> 
    <constructor-arg value="maximumSize=42, expireAfterAccess=10m, expireAfterWrite=1h" /> 
</bean> 

तुम भी एक .properties फ़ाइल में विन्यास स्ट्रिंग बाह्यरूप सकता है, वसंत के PropertyPlaceholderConfigurer का उपयोग कर।

तब तक, आपको शॉन पैट्रिक फ़्लॉइड के समाधान का उपयोग करना चाहिए (जिसे टाइप-सुरक्षित होने का भी लाभ है)।

2

यह भी जोड़ना चाहता था कि आप अलग कैश के लिए अलग कैश बिल्डर्स में रुचि नहीं रखते हैं तो आप सीधे कैश प्लेयर में कैश स्पेक का उपयोग कर सकते हैं।

कैश प्रबंधक को प्रारंभ करते समय आपको प्रत्येक कैश को नाम से निर्दिष्ट करने की आवश्यकता नहीं है, कैश के लिए प्रत्येक नया अनुरोध प्रदान किए गए कैशबिल्डर पर आधारित होगा, या इस मामले में प्रदान किए गए कैश स्पेक के साथ (जिसके परिणामस्वरूप संबंधित कैशबिल्डर)।

<bean id="cacheManager" class="org.springframework.cache.guava.GuavaCacheManager"> 
    <property name="cacheSpecification" value="maximumSize=300000,expireAfterWrite=10h" /> 
</bean> 

यह भी ध्यान रखें: मत भूलना अपने आवेदन config एक्सएमएल में कुछ इस तरह शामिल करके वसंत आप कैशिंग उपयोग कर रहे हैं बताने के लिए:

आप स्प्रिंग एक्सएमएल अत्यंत सुरुचिपूर्ण जा रहा समाप्त होता है कर रहे हैं

<cache:annotation-driven/> 

जो तुम निश्चित रूप से करने की आवश्यकता होगी निर्धारित करें:

xmlns:cache="http://www.springframework.org/schema/cache" 
xsi:schemaLocation="http://www.springframework.org/schema/cache classpath:org/springframework/cache/config/spring-cache-4.2.xsd" 

आप नहीं कर रहे हैं इस तरह कुछ आसान है और आप विभिन्न उपयोग मामलों के लिए एकाधिक कैशबिल्डर चाहते हैं तो आप शायद अपनी फैक्टरी कक्षा और विधि बनाना चाहेंगे।