2013-10-23 5 views
6

वसंत 3 स्पेल, #this और #root पेश किए गए थे।#root और # थी स्पेल

परिवर्तनीय #root हमेशा परिभाषित किया जाता है और रूट संदर्भ ऑब्जेक्ट को संदर्भित करता है। यद्यपि # यह अभिव्यक्ति के घटकों के रूप में भिन्न हो सकता है मूल्यांकन किया गया है, #root हमेशा रूट को संदर्भित करता है।

मैं प्रलेखन के माध्यम से चले गए हैं, लेकिन मैं अभी भी समझ में नहीं आता #root का अर्थ है (वहाँ कोई उदाहरण है) क्या। क्या कोई मुझे एक उदाहरण दे सकता है?

उत्तर

7

मान लीजिए कि हम निम्नलिखित कोड का टुकड़ा करते हैं, कि कई प्राइम संख्या के साथ एक सूची भरता है और एक स्पेल संदर्भ में एक चर के रूप में परिभाषित:

// create an array of integers 
List<Integer> primes = new ArrayList<Integer>(); 
primes.addAll(Arrays.asList(2,3,5,7,11,13,17)); 

// create parser and set variable 'primes' as the array of integers 
ExpressionParser parser = new SpelExpressionParser(); 
StandardEvaluationContext ctx = new StandardEvaluationContext(); 
ctx.setVariable("primes", primes); 

अब, अगर हम सूची को संकीर्ण और प्राप्त करना चाहते हैं सभी प्रमुख संख्याएं> 10 हैं, हम ?[] चयन ऑपरेटर का उपयोग कर सकते हैं। बयान यह एक होगा:

Expression expression = parser.parseExpression("#primes.?[#this>10]"); 
List<Integer> primesGreaterThanTen = (List<Integer>) expression.getValue(ctx); 

आप देख सकते हैं, अभिव्यक्ति का मूल्यांकन किया जाना #primes.?[#this > 10] है। यह कैसे काम करता है ?

  • #primesprimes सूची को संदर्भित करता है।
  • ?[] चयन ऑपरेटर सूची में i प्रत्येक ऑब्जेक्ट से मेल खाता है शून्य नहीं है और जो ब्रैकेट में दिए गए मानदंडों से मेल खाता है। हमारे उदाहरण में, मानदंड #this > 10 है। #this वर्तमान मूल्यांकन ऑब्जेक्ट को संदर्भित करता है, जो हमारे उदाहरण में ऑब्जेक्ट की सूची से ऑब्जेक्ट होगा जो इस समय चेक-इन और 10 के लिए चेक किया जा रहा है।

मूल्यांकन से परिणाम एक सूची हो जाएगा, युक्त

[11, 13, 17] 

एक स्पेल संदर्भ एक #root चर हो सकता है। चलो इस साधारण क्लास करते हैं:

public class SomeCustomObject { 
    public int stringLength(String input) { 
     if (input == null) return 0; 
     return input.length(); 
    } 
} 

और #root चर के रूप में हमारे SomeCustomObject का एक उदाहरण परिभाषित करते हैं।

SomeCustomObject someObject = new SomeCustomObject(); 
context.setRootObject(someObject); 

यह someObject चर स्पेल संदर्भ के लिए एक रूट वस्तु का निर्माण करेगा।

#root चर के साथ एक साधारण उदाहरण।

String name = "kocko"; 
ctx.setVariable("name", kocko); 
String statement = "#root.stringLength(#kocko) == 5"; 
Expression expression = parser.parseExpression(statement); 

boolean result = expression.getValue(context, Boolean.class); 

result चर true के रूप में मूल्यांकन किया जाएगा।

#root की शक्ति क्या है?

एक ही रूट ऑब्जेक्ट के माध्यम से, आप अपने अभिव्यक्तियों के लिए एक व्यापक, कस्टम वातावरण का पर्दाफाश कर सकते हैं, उदाहरण के लिए कस्टम उपयोगिता विधियों और/या चर

और जानकारी:

1

#this वस्तु एक संग्रह प्रक्षेपण की तरह कुछ के दौरान अभिव्यक्ति के एक हिस्से के सापेक्ष बदलता है, लेकिन #root वस्तु नहीं करता है।

तो, अपने संदर्भ में आप दो चर अगर: प्रक्षेपण के भीतर

myNumbers.?[#this lt #root.maxNumber] 

: संख्या myNumbers की एक सूची है और एक ही नंबर maxNumber, आप की तरह एक स्पेल अभिव्यक्ति के साथ उस सूची पर एक प्रक्षेपण बना सकते हैं अभिव्यक्ति (स्क्वायर ब्रैकेट के अंदर), #this ऑब्जेक्ट उस संग्रह में आइटम है जिसे यह देखने के लिए चेक किया जा रहा है कि यह फ़िल्टर पास करता है, जबकि #root ऑब्जेक्ट अभी भी वैश्विक संदर्भ में चर है।

आप Collection Selection documentation example में की तरह एक और अधिक दिलचस्प वस्तु की एक सूची है, तो:

Members.?[Nationality == 'Serbian'] 

"राष्ट्रीयता" #this, सदस्य वस्तु के सापेक्ष है यही कारण है कि। यह काम नहीं होगा

Members.?[Nationality == #root.searchedForNationality] 

तुम सिर्फ [Nationality == searchedForNationality] की कोशिश की थी क्योंकि searchedForNationality सदस्य का हिस्सा नहीं है: यदि आप एक स्ट्रिंग शाब्दिक के बजाय एक जड़ संदर्भ चर के खिलाफ तुलना करना चाहता था, तो आप सब करने की ज़रूरत होगी ऑब्जेक्ट, लेकिन रूट ऑब्जेक्ट पर एक चर। इसे योग्यता के लिए आपको #root का उपयोग करने की आवश्यकता है क्योंकि डिफ़ॉल्ट रूप से अयोग्य संदर्भ #this ऑब्जेक्ट के सापेक्ष हैं।

संबंधित मुद्दे